cloud-server-account/src/main/java/com/dsh/account/controller/ClassDetailsController.java
@@ -108,7 +108,6 @@ @PostMapping("/api/startCource/addData") @ApiOperation(value = "添加学员信息", tags = {"APP-开始上课"}) @ApiImplicitParams({ @ApiImplicitParam(value = "学员信息", name = "stu", required = true, dataType = "int"), @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) @Transactional @@ -370,57 +369,6 @@ }catch (Exception e){ return ResultUtil.runErr(); } } /** * 课后视频课表 */ @ResponseBody @PostMapping("/api/startCource/afterSourceDetails") @ApiOperation(value = "课后视频课表", tags = {"APP-开始上课"}) @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."), @ApiImplicitParam(value = "学员id", name = "stuId", required = true, dataType = "int"), }) public ResultUtil queryAfterSourceDetails(@RequestParam("stuId") Integer stuId){ try { Integer appUserId = tokenUtil.getUserIdFormRedis(); if(null == appUserId){ return ResultUtil.tokenErr(); } // TODO: 2023/7/4 return ResultUtil.success(); }catch (Exception e){ return ResultUtil.runErr(); } } /** * 已报名课程列表 */ @ResponseBody @PostMapping("/api/startCource/registeredCourses") @ApiOperation(value = "已报名课程列表", tags = {"APP-开始上课"}) @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."), @ApiImplicitParam(value = "学员id", name = "stuId", required = true, dataType = "int"), }) public ResultUtil<List<RegisterCourseVo>> queryRegisteredCoursesDetails(@RequestParam("stuId") Integer stuId){ try { Integer appUserId = tokenUtil.getUserIdFormRedis(); if(null == appUserId){ return ResultUtil.tokenErr(); } return ResultUtil.success(); }catch (Exception e){ return ResultUtil.runErr(); } } cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CoursePaymentClient.java
@@ -27,4 +27,7 @@ @PostMapping("/base/coursePack/afterCourseTwos") List<AfterVideoVo> getAfterCourseTwos(@RequestParam("appUserId") Integer appUserId); @PostMapping("/base/coursePack/courseOfPurchased") List<PurchaseVo> getAppUsersCourseData(@RequestBody Integer appUserId); } cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/CourseTypeResp.java
New file @@ -0,0 +1,16 @@ package com.dsh.account.feignclient.course.model; import lombok.Data; @Data public class CourseTypeResp { private Integer appUserId; private Integer courseTypeId; private String search; } cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/PurchaseVo.java
New file @@ -0,0 +1,37 @@ package com.dsh.account.feignclient.course.model; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class PurchaseVo { @ApiModelProperty(value = "课包id") private Integer courseId; @ApiModelProperty(value = "课包封面图") private String packageImg; @ApiModelProperty(value = "课包名称") private String courseName; @ApiModelProperty(value = "上课时间段") private String courseTime; @ApiModelProperty(value = "授课老师id") private Integer teacherId; @ApiModelProperty(value = "门店id") private Integer storeId; @ApiModelProperty(value = "已上课时数") private Integer courseNums; @ApiModelProperty(value = "课包状态 1=待支付 2=已购买") private Integer courseStatus; @ApiModelProperty(value = "课包类型id") private Integer courseTypeId; } cloud-server-account/src/main/java/com/dsh/account/service/impl/TAppUserServiceImpl.java
@@ -8,6 +8,7 @@ import com.dsh.account.feignclient.activity.MerChandiseClient; import com.dsh.account.feignclient.course.CoursePaymentClient; import com.dsh.account.feignclient.course.model.CourseOfStoreVo; import com.dsh.account.feignclient.course.model.PurchaseVo; import com.dsh.account.feignclient.course.model.QueryStoreList; import com.dsh.account.feignclient.course.model.StuCourseResp; import com.dsh.account.feignclient.other.ImgConfigClient; @@ -25,6 +26,7 @@ import com.dsh.account.model.vo.classDetails.RegisteredCourse; import com.dsh.account.model.vo.classDetails.WeekedCourse; import com.dsh.account.model.vo.classDetails.classInsVo.ClassInfoVo; import com.dsh.account.model.vo.classDetails.classInsVo.RegisterCourseVo; import com.dsh.account.model.vo.userBenefitDetail.BillingDetailsVo; import com.dsh.account.model.vo.userBenefitDetail.IndexOfUserBenefirVo; import com.dsh.account.service.TAppUserService; @@ -477,7 +479,8 @@ @Override public BillingDetailsVo queryUserBillingDetails(String yearMonth, Integer recordId) { System.out.println("账单传参:yearMonth"+yearMonth+"|"+"recordId"+recordId); // TODO: 2023/7/4 // TODO: 2023/7/4 账单列表 return null; } } cloud-server-account/src/main/java/com/dsh/account/service/impl/TStudentServiceImpl.java
@@ -354,7 +354,7 @@ @Override public ResultUtil renewClassPayment(Integer userIdFormRedis, ClasspaymentRequest request) { // TODO: 2023/7/5 // TODO: 2023/7/5 续课支付 switch (request.getPayType()){ case 1: WeChatPayment(); cloud-server-activity/src/main/java/com/dsh/activity/controller/BenefitVideoController.java
New file @@ -0,0 +1,29 @@ package com.dsh.activity.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.dsh.activity.entity.BenefitsVideos; import com.dsh.activity.service.BenefitsVideosService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("") public class BenefitVideoController { @Autowired private BenefitsVideosService bfvService; @PostMapping("base/benefitVideo/getList") public BenefitsVideos getVideosWithIds(@RequestBody Integer id){ return bfvService.getOne(new QueryWrapper<BenefitsVideos>().eq("id",id).eq("state",1)); } } cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideos.java
New file @@ -0,0 +1,74 @@ package com.dsh.activity.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.activerecord.Model; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; import java.util.Date; /** * <p> * 福利视频 * </p> * * @author jqs * @since 2023-07-06 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("t_benefits_videos") public class BenefitsVideos extends Model<BenefitsVideos> { private static final long serialVersionUID = 1L; /** * 主键 */ @TableId(value = "id", type = IdType.AUTO) private Integer id; /** * 分类id */ private Integer benefitsVideoClassificationId; /** * 视频名称 */ private String name; /** * 视频封面 */ private String cover; /** * 视频简介 */ private String introduction; /** * 视频地址 */ private String videos; /** * 可得积分 */ private String integral; /** * 状态(1=正常,2=冻结,3=删除) */ private Integer state; /** * 添加时间 */ private Date insertTime; @Override protected Serializable pkVal() { return this.id; } } cloud-server-activity/src/main/java/com/dsh/activity/feignclient/BenefitVideoClient.java
New file @@ -0,0 +1,16 @@ package com.dsh.activity.feignclient; import com.dsh.activity.entity.BenefitsVideos; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @FeignClient(value = "mb-cloud-activity") public interface BenefitVideoClient { @PostMapping("base/benefitVideo/getList") BenefitsVideos getVideosWithIds(@RequestBody Integer id); } cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideosMapper.java
New file @@ -0,0 +1,16 @@ package com.dsh.activity.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dsh.activity.entity.BenefitsVideos; /** * <p> * 福利视频 Mapper 接口 * </p> * * @author jqs * @since 2023-07-06 */ public interface BenefitsVideosMapper extends BaseMapper<BenefitsVideos> { } cloud-server-activity/src/main/java/com/dsh/activity/service/BenefitsVideosService.java
New file @@ -0,0 +1,16 @@ package com.dsh.activity.service; import com.baomidou.mybatisplus.extension.service.IService; import com.dsh.activity.entity.BenefitsVideos; /** * <p> * 福利视频 服务类 * </p> * * @author jqs * @since 2023-07-06 */ public interface BenefitsVideosService extends IService<BenefitsVideos> { } cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideosServiceImpl.java
New file @@ -0,0 +1,20 @@ package com.dsh.activity.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dsh.activity.entity.BenefitsVideos; import com.dsh.activity.mapper.BenefitsVideosMapper; import com.dsh.activity.service.BenefitsVideosService; import org.springframework.stereotype.Service; /** * <p> * 福利视频 服务实现类 * </p> * * @author jqs * @since 2023-07-06 */ @Service public class BenefitsVideosServiceImpl extends ServiceImpl<BenefitsVideosMapper, BenefitsVideos> implements BenefitsVideosService { } cloud-server-activity/src/main/java/com/dsh/activity/web/PointsMerchandiseController.java
File was deleted cloud-server-activity/src/main/resources/mapper/BenefitsVideosMapper.xml
New file @@ -0,0 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.dsh.activity.mapper.BenefitsVideosMapper"> </mapper> cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java
@@ -5,20 +5,31 @@ import com.dsh.course.entity.TCoursePackage; import com.dsh.course.entity.TCoursePackageDiscount; import com.dsh.course.entity.TCoursePackagePayment; import com.dsh.course.entity.TCoursePackageType; import com.dsh.course.feignclient.model.*; import com.dsh.course.model.BaseVo; import com.dsh.course.model.dto.DiscountJsonDto; import com.dsh.course.model.vo.CourseDetailRequest; import com.dsh.course.service.PostCourseVideoService; import com.dsh.course.service.TCoursePackageDiscountService; import com.dsh.course.service.TCoursePackagePaymentService; import com.dsh.course.service.TCoursePackageService; import com.dsh.course.model.vo.RegisterCourseVo; import com.dsh.course.model.vo.request.CourseOfAfterRequest; import com.dsh.course.model.vo.request.CourseWithDetailsRequest; import com.dsh.course.model.vo.request.UpdateCourseVideoStatusRequest; import com.dsh.course.model.vo.response.AppUserVideoResponse; import com.dsh.course.model.vo.response.CourseOfVideoResponse; import com.dsh.course.service.*; import com.dsh.course.util.DateUtil; import com.dsh.course.util.ResultUtil; import com.dsh.course.util.StrUtils; import com.dsh.course.util.TokenUtil; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -49,6 +60,18 @@ @Autowired private PostCourseVideoService pcvService; @Autowired private CoursePackageStudentService cpsService; @Autowired private CancelledClassesService cacService; @Autowired private TCoursePackageTypeService coursePackageTypeService; @Autowired private TokenUtil tokenUtil; private final SimpleDateFormat format = new SimpleDateFormat("MM-dd HH:mm"); @@ -221,7 +244,7 @@ } courseVo.setCourseTime(coursePackage.getClassStartTime()+"-"+coursePackage.getClassEndTime()); String payType = tCoursePackagePayment.getPayType(); Integer payType = tCoursePackagePayment.getPayType(); BigDecimal cashPayment = tCoursePackagePayment.getCashPayment(); double cashPaymentValue = cashPayment.doubleValue(); Integer playPaiCoin = tCoursePackagePayment.getPlayPaiCoin(); @@ -240,16 +263,12 @@ throw new RuntimeException(e); } switch (payType) { case "1;2": courseVo.setAmount(cashPaymentValue); courseVo.setVipAmount(discountMember); courseVo.setWpGold(playPaiCoin); break; case "1": case 1: case 2: courseVo.setAmount(cashPaymentValue); courseVo.setVipAmount(discountMember); break; case "2": case 3: courseVo.setWpGold(playPaiCoin); break; } @@ -266,11 +285,194 @@ List<TCoursePackagePayment> tCoursePackagePayments = packagePaymentService.queryAllCoursePackage(null,null,null,null,appUserId); List<Integer> coursePackageIds = tCoursePackagePayments.stream().map(TCoursePackagePayment::getCoursePackageId).collect(Collectors.toList()); // List<PostCourseVideo> videoList = pcvService.queryAllVideoNoneShow(coursePackageIds); // TODO: 2023/7/6 两个课后视频 return videoVos; } @ResponseBody @PostMapping("/api/course/queryArrangeCourseList") @ApiOperation(value = "获取布置课程列表", tags = {"APP-课程列表"}) @ApiImplicitParams({ }) public ResultUtil<List<BaseVo>> queryArrangePackageType(){ try { Integer appUserId = tokenUtil.getUserIdFormRedis(); if(null == appUserId){ return ResultUtil.tokenErr(); } List<TCoursePackagePayment> tCoursePackagePayments = packagePaymentService.queryAllCoursePackage(null,null,null,null,appUserId); List<BaseVo> list = new ArrayList<>(); tCoursePackagePayments.forEach(c -> { BaseVo baseVo = new BaseVo(); baseVo.setId(c.getCoursePackageId()); TCoursePackage coursePackage = tcpService.getById(c.getCoursePackageId()); baseVo.setName(coursePackage.getName()); list.add(baseVo); }); return ResultUtil.success(); }catch (Exception e){ e.printStackTrace(); return ResultUtil.runErr(); } } /** * 课后视频课表 */ @ResponseBody @PostMapping("/api/startCource/afterSourceList") @ApiOperation(value = "课后视频课表", tags = {"APP-开始上课"}) @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."), @ApiImplicitParam(name = "search",value = "视频名称", required = true, dataType = "int"), }) public ResultUtil<List<AppUserVideoResponse>> queryAfterSourceList(@RequestBody CourseOfAfterRequest search){ try { Integer appUserId = tokenUtil.getUserIdFormRedis(); if(null == appUserId){ return ResultUtil.tokenErr(); } List<Integer> courseIds = new ArrayList<>(); List<TCoursePackagePayment> tCoursePackagePayments = packagePaymentService.queryAllCoursePackage(null,null,search.getCourseTypeId(),null,appUserId); if (tCoursePackagePayments.size() > 0 ){ courseIds = tCoursePackagePayments.stream().map(TCoursePackagePayment::getCoursePackageId).collect(Collectors.toList()); } return ResultUtil.success(packagePaymentService.queryAfterVideo(search,courseIds)); }catch (Exception e){ return ResultUtil.runErr(); } } /** * 课后视频详情 */ @ResponseBody @PostMapping("/api/startCource/afterSourceDetail") @ApiOperation(value = "课后视频详情", tags = {"APP-开始上课"}) @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."), @ApiImplicitParam(name = "search",value = "视频名称", required = true, dataType = "int"), }) public ResultUtil<CourseOfVideoResponse> queryAfterSourceDetails(@RequestBody CourseWithDetailsRequest detailsRequest){ try { Integer appUserId = tokenUtil.getUserIdFormRedis(); if(null == appUserId){ return ResultUtil.tokenErr(); } return ResultUtil.success(packagePaymentService.queryVideoDetails(detailsRequest,appUserId)); }catch (Exception e){ return ResultUtil.runErr(); } } /** * 更新课后视频学习状态 */ @ResponseBody @PostMapping("/api/startCource/updateVideoStatus") @ApiOperation(value = "更新课后视频学习状态", tags = {"APP-开始上课"}) @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."), @ApiImplicitParam(name = "search",value = "视频名称", required = true, dataType = "int"), }) public ResultUtil updateVideoStatus(@RequestBody UpdateCourseVideoStatusRequest detailsRequest){ try { Integer appUserId = tokenUtil.getUserIdFormRedis(); if(null == appUserId){ return ResultUtil.tokenErr(); } return ResultUtil.success(packagePaymentService.updateVideoStatus(detailsRequest,appUserId)); }catch (Exception e){ return ResultUtil.runErr(); } } @ResponseBody @PostMapping("/api/course/getCourseAppUserDetails") @ApiOperation(value = "已报名课程-获取课程类型列表", tags = {"APP-课程列表"}) @ApiImplicitParams({ }) public ResultUtil<List<BaseVo>> queryCoursePackageType(){ try { List<TCoursePackageType> coursePackageTypes = coursePackageTypeService.list(new QueryWrapper<TCoursePackageType>().eq("state", 1)); List<BaseVo> list = new ArrayList<>(); coursePackageTypes.forEach(c -> { BaseVo baseVo = new BaseVo(); BeanUtils.copyProperties(c, baseVo); list.add(baseVo); }); return ResultUtil.success(list); }catch (Exception e){ e.printStackTrace(); return ResultUtil.runErr(); } } // // @PostMapping("/base/coursePack/courseOfPurchased") // public List<PurchaseVo> getAppUsersCourseData(@RequestBody Integer appUserId){ // List<PurchaseVo> voList = new ArrayList<>(); //// 查询够课包记录 // List<TCoursePackagePayment> tCoursePackagePayments = packagePaymentService.queryAllCoursePackage(null,null,null,null,appUserId); // //查询上课记录 // List<Integer> coursePackageIds = tCoursePackagePayments.stream().map(TCoursePackagePayment::getCoursePackageId).collect(Collectors.toList()); // List<CoursePackageStudent> packageStudents = cpsService.queryAppUserOfStuAttendClass(appUserId,coursePackageIds); // Map<Integer, Long> collect = packageStudents.stream() // .collect(Collectors.groupingBy(CoursePackageStudent::getCoursePackageId, Collectors.counting())); // // if (tCoursePackagePayments.size() > 0){ // for (TCoursePackagePayment tCoursePackagePayment : tCoursePackagePayments) { // TCoursePackage coursePackage = tcpService.getById(tCoursePackagePayment.getCoursePackageId()); // PurchaseVo purchaseVo = new PurchaseVo(); // purchaseVo.setCourseId(tCoursePackagePayment.getCoursePackageId()); // purchaseVo.setCourseName(coursePackage.getName()); // purchaseVo.setCourseTime(coursePackage.getClassStartTime()+"-"+coursePackage.getClassEndTime()); // purchaseVo.setStoreId(coursePackage.getStoreId()); // purchaseVo.setTeacherId(coursePackage.getCoachId()); // purchaseVo.setPackageImg(coursePackage.getCoverDrawing()); // purchaseVo.setCourseStatus(tCoursePackagePayment.getPayStatus()); // purchaseVo.setCourseTypeId(coursePackage.getCoursePackageTypeId()); // for (Map.Entry<Integer, Long> entry : collect.entrySet()) { // int coursePackageId = entry.getKey(); // if (tCoursePackagePayment.getCoursePackageId() == coursePackageId) { // purchaseVo.setCourseNums((int) (entry.getValue()*2)); // } // } // voList.add(purchaseVo); // } // } // return voList; // } /** * 已报名课程列表 */ @ResponseBody @PostMapping("/api/startCource/registeredCourses") @ApiOperation(value = "已报名课程-课程列表", tags = {"APP-开始上课"}) @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."), }) public ResultUtil<List<RegisterCourseVo>> queryRegisteredCoursesDetails(@RequestBody CourseOfAfterRequest courseTypeId){ try { Integer appUserId = tokenUtil.getUserIdFormRedis(); if(null == appUserId){ return ResultUtil.tokenErr(); } return ResultUtil.success(packagePaymentService.queryRegisteredCourseList(courseTypeId,appUserId)); }catch (Exception e){ return ResultUtil.runErr(); } } cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackagePayment.java
@@ -43,9 +43,9 @@ */ private Integer coursePackageId; /** * 支付方式(1=现金,2=玩湃币) * 支付方式(1=微信,2=支付宝,3=玩湃币) */ private String payType; private Integer payType; /** * 课时数 */ cloud-server-course/src/main/java/com/dsh/course/entity/UserVideoDetails.java
New file @@ -0,0 +1,63 @@ package com.dsh.course.entity; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.activerecord.Model; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; import java.util.Date; /** * <p> * 用户观看视频记录 * </p> * * @author jqs * @since 2023-07-06 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("t_user_video_details") public class UserVideoDetails extends Model<UserVideoDetails> { private static final long serialVersionUID = 1L; /** * 主键id */ private Integer id; /** * 用户id */ private Integer appUserId; /** * 课包id */ private Integer coursePackageId; /** * 课后视频id */ private Integer courseId; /** * 状态(1未学习 2已学习) */ private Integer state; /** * 添加时间 */ private Date insertTime; /** * 更新时间 */ private Date updateTime; @Override protected Serializable pkVal() { return this.id; } } cloud-server-course/src/main/java/com/dsh/course/feignclient/CoursePaymentClient.java
@@ -28,4 +28,8 @@ @PostMapping("/base/coursePack/afterCourseTwos") List<AfterVideoVo> getAfterCourseTwos(@RequestParam("appUserId") Integer appUserId); @PostMapping("/base/coursePack/courseOfPurchased") public List<PurchaseVo> getAppUsersCourseData(@RequestBody Integer appUserId); } cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/BenefitVideoClient.java
New file @@ -0,0 +1,16 @@ package com.dsh.course.feignclient.activity; import com.dsh.course.feignclient.activity.model.BenefitsVideos; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @FeignClient(value = "mb-cloud-activity") public interface BenefitVideoClient { @PostMapping("base/benefitVideo/getList") BenefitsVideos getVideosWithIds(@RequestBody Integer id); } cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/model/BenefitsVideos.java
New file @@ -0,0 +1,61 @@ package com.dsh.course.feignclient.activity.model; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import java.util.Date; /** * <p> * 福利视频 * </p> * * @author jqs * @since 2023-07-06 */ @Data public class BenefitsVideos { private static final long serialVersionUID = 1L; /** * 主键 */ @TableId(value = "id", type = IdType.AUTO) private Integer id; /** * 分类id */ private Integer benefitsVideoClassificationId; /** * 视频名称 */ private String name; /** * 视频封面 */ private String cover; /** * 视频简介 */ private String introduction; /** * 视频地址 */ private String videos; /** * 可得积分 */ private String integral; /** * 状态(1=正常,2=冻结,3=删除) */ private Integer state; /** * 添加时间 */ private Date insertTime; } cloud-server-course/src/main/java/com/dsh/course/feignclient/model/PurchaseVo.java
New file @@ -0,0 +1,37 @@ package com.dsh.course.feignclient.model; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class PurchaseVo { @ApiModelProperty(value = "课包id") private Integer courseId; @ApiModelProperty(value = "课包封面图") private String packageImg; @ApiModelProperty(value = "课包名称") private String courseName; @ApiModelProperty(value = "上课时间段") private String courseTime; @ApiModelProperty(value = "授课老师id") private Integer teacherId; @ApiModelProperty(value = "门店id") private Integer storeId; @ApiModelProperty(value = "已上课时数") private Integer courseNums; @ApiModelProperty(value = "课包状态 1=待支付 2=已购买") private Integer courseStatus; @ApiModelProperty(value = "课包类型id") private Integer courseTypeId; } cloud-server-course/src/main/java/com/dsh/course/mapper/CoursePackageStudentMapper.java
@@ -20,4 +20,7 @@ @Param("stuId") Integer stuId, @Param("appUserId") Integer appUserId); List<CoursePackageStudent> queryAppUserOfStuAttendClass(@Param("appUserId")Integer appUserId, @Param("coursePackageIds")List<Integer> coursePackageIds); } cloud-server-course/src/main/java/com/dsh/course/mapper/PostCourseVideoMapper.java
@@ -2,6 +2,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dsh.course.entity.PostCourseVideo; import org.apache.ibatis.annotations.Param; import java.util.List; /** * <p> @@ -13,4 +16,6 @@ */ public interface PostCourseVideoMapper extends BaseMapper<PostCourseVideo> { List<PostCourseVideo> queryPostCourseVideolist(@Param("courseIds") List<Integer> courseIds); } cloud-server-course/src/main/java/com/dsh/course/mapper/UserVideoDetailsMapper.java
New file @@ -0,0 +1,21 @@ package com.dsh.course.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dsh.course.entity.UserVideoDetails; import org.apache.ibatis.annotations.Param; import java.util.List; /** * <p> * 用户观看视频记录 Mapper 接口 * </p> * * @author jqs * @since 2023-07-06 */ public interface UserVideoDetailsMapper extends BaseMapper<UserVideoDetails> { List<UserVideoDetails> queryAppUserWatchVideo(@Param("videoIds") List<Integer> videoIds); } cloud-server-course/src/main/java/com/dsh/course/model/vo/RegisterCourseVo.java
New file @@ -0,0 +1,28 @@ package com.dsh.course.model.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class RegisterCourseVo { @ApiModelProperty(value = "课包id") private Integer coursePackageId; @ApiModelProperty(value = "课包封面图") private String packageImg; @ApiModelProperty(value = "课包名称+门店名称") private String courseNameStore; @ApiModelProperty(value = "上课时间段") private String courseTime; @ApiModelProperty(value = "授课老师") private String courseTeacher; @ApiModelProperty(value = "已上课时数") private Integer courseNums; } cloud-server-course/src/main/java/com/dsh/course/model/vo/StuCourseRequest.java
File was deleted cloud-server-course/src/main/java/com/dsh/course/model/vo/request/CourseOfAfterRequest.java
New file @@ -0,0 +1,17 @@ package com.dsh.course.model.vo.request; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class CourseOfAfterRequest { @ApiModelProperty(value = "课程类型id",dataType = "int",required = false) private Integer courseTypeId; @ApiModelProperty(value = "课程名称/门店名称",dataType = "string",required = false) private String search; } cloud-server-course/src/main/java/com/dsh/course/model/vo/request/CourseWithDetailsRequest.java
New file @@ -0,0 +1,16 @@ package com.dsh.course.model.vo.request; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class CourseWithDetailsRequest { @ApiModelProperty(value = "视频id") private Integer videoId; @ApiModelProperty(value = "课包id") private Integer coursePackageId; } cloud-server-course/src/main/java/com/dsh/course/model/vo/request/UpdateCourseVideoStatusRequest.java
New file @@ -0,0 +1,20 @@ package com.dsh.course.model.vo.request; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class UpdateCourseVideoStatusRequest { @ApiModelProperty(value = "视频id") private Integer videoId; @ApiModelProperty(value = "课包id") private Integer coursePackageId; @ApiModelProperty(value = "是否看完 1是 2否") private Integer isOver; } cloud-server-course/src/main/java/com/dsh/course/model/vo/response/AppUserVideoResponse.java
New file @@ -0,0 +1,34 @@ package com.dsh.course.model.vo.response; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class AppUserVideoResponse { @ApiModelProperty(value = "视频id") private Integer videoId; @ApiModelProperty(value = "课包id") private Integer coursePackageId; @ApiModelProperty(value = "封面图") private String coverImage; @ApiModelProperty(value = "视频名称") private String videoName; @ApiModelProperty(value = "布置课程名称") private String packageName; @ApiModelProperty(value = "简介") private String synopsis; @ApiModelProperty(value = "可得积分") private String integral; @ApiModelProperty(value = "学习状态 1未学习 2已学习") private Integer studyStatus; } cloud-server-course/src/main/java/com/dsh/course/model/vo/response/CourseOfVideoResponse.java
New file @@ -0,0 +1,37 @@ package com.dsh.course.model.vo.response; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class CourseOfVideoResponse { @ApiModelProperty(value = "视频id") private Integer videoId; @ApiModelProperty(value = "课包id") private Integer coursePackageId; @ApiModelProperty(value = "视频url") private String videoURL; @ApiModelProperty(value = "视频名称") private String videoName; @ApiModelProperty(value = "可得积分") private String integral; @ApiModelProperty(value = "学习状态 1未学习 2已学习") private Integer studyStatus; @ApiModelProperty(value = "布置课程名称") private String packageName; @ApiModelProperty(value = "视频简介") private String synopsis; @ApiModelProperty(value = "课程介绍图片") private String detailedDiagram; } cloud-server-course/src/main/java/com/dsh/course/service/CoursePackageStudentService.java
@@ -17,4 +17,6 @@ List<CoursePackageStudent> queryStuDeduClassHourNums(Integer courseId, Integer stuId, Integer appUserId); List<CoursePackageStudent> queryAppUserOfStuAttendClass(Integer appUserId, List<Integer> coursePackageIds); } cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackagePaymentService.java
@@ -2,6 +2,12 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.dsh.course.entity.TCoursePackagePayment; import com.dsh.course.model.vo.RegisterCourseVo; import com.dsh.course.model.vo.request.CourseOfAfterRequest; import com.dsh.course.model.vo.request.CourseWithDetailsRequest; import com.dsh.course.model.vo.request.UpdateCourseVideoStatusRequest; import com.dsh.course.model.vo.response.AppUserVideoResponse; import com.dsh.course.model.vo.response.CourseOfVideoResponse; import java.util.Date; import java.util.List; @@ -25,4 +31,37 @@ * @return */ Integer queryCountNumber(Integer coursePackageId); /** * 查询课包发布的课后视频列表 * @param search * @param courseIds * @return */ List<AppUserVideoResponse> queryAfterVideo(CourseOfAfterRequest search,List<Integer> courseIds); /** * 获取课后视频详情 * @param detailsRequest * @param appUserId * @return */ CourseOfVideoResponse queryVideoDetails(CourseWithDetailsRequest detailsRequest,Integer appUserId); /** * 更新视频学习状态 * @param detailsRequest * @param appUserId * @return */ String updateVideoStatus(UpdateCourseVideoStatusRequest detailsRequest, Integer appUserId); /** * 获取用户已报名课程 * @param courseTypeId * @param appUserId * @return */ List<RegisterCourseVo> queryRegisteredCourseList(CourseOfAfterRequest courseTypeId, Integer appUserId); } cloud-server-course/src/main/java/com/dsh/course/service/UserVideoDetailsService.java
New file @@ -0,0 +1,16 @@ package com.dsh.course.service; import com.baomidou.mybatisplus.extension.service.IService; import com.dsh.course.entity.UserVideoDetails; /** * <p> * 用户观看视频记录 服务类 * </p> * * @author jqs * @since 2023-07-06 */ public interface UserVideoDetailsService extends IService<UserVideoDetails> { } cloud-server-course/src/main/java/com/dsh/course/service/impl/CoursePackageStudentServiceImpl.java
@@ -23,4 +23,9 @@ public List<CoursePackageStudent> queryStuDeduClassHourNums(Integer courseId, Integer stuId, Integer appUserId) { return this.baseMapper.queryStuDeduClassHourNums(courseId,stuId,appUserId); } @Override public List<CoursePackageStudent> queryAppUserOfStuAttendClass(Integer appUserId, List<Integer> coursePackageIds) { return this.baseMapper.queryAppUserOfStuAttendClass(appUserId,coursePackageIds); } } cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackagePaymentServiceImpl.java
@@ -1,13 +1,31 @@ package com.dsh.course.service.impl; import com.dsh.course.entity.TCoursePackagePayment; import com.dsh.course.mapper.TCoursePackagePaymentMapper; import com.dsh.course.service.TCoursePackagePaymentService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dsh.course.entity.PostCourseVideo; import com.dsh.course.entity.TCoursePackage; import com.dsh.course.entity.TCoursePackagePayment; import com.dsh.course.entity.UserVideoDetails; import com.dsh.course.feignclient.activity.BenefitVideoClient; import com.dsh.course.feignclient.activity.model.BenefitsVideos; import com.dsh.course.mapper.PostCourseVideoMapper; import com.dsh.course.mapper.TCoursePackageMapper; import com.dsh.course.mapper.TCoursePackagePaymentMapper; import com.dsh.course.mapper.UserVideoDetailsMapper; import com.dsh.course.model.vo.RegisterCourseVo; import com.dsh.course.model.vo.request.CourseOfAfterRequest; import com.dsh.course.model.vo.request.CourseWithDetailsRequest; import com.dsh.course.model.vo.request.UpdateCourseVideoStatusRequest; import com.dsh.course.model.vo.response.AppUserVideoResponse; import com.dsh.course.model.vo.response.CourseOfVideoResponse; import com.dsh.course.service.TCoursePackagePaymentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Date; import java.util.List; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; /** * <p> @@ -19,6 +37,22 @@ */ @Service public class TCoursePackagePaymentServiceImpl extends ServiceImpl<TCoursePackagePaymentMapper, TCoursePackagePayment> implements TCoursePackagePaymentService { @Autowired BenefitVideoClient bfvoClient; @Autowired private UserVideoDetailsMapper uvdmapper; @Autowired private PostCourseVideoMapper pcvMapper; @Autowired private TCoursePackageMapper tcpmapper; @Override public List<TCoursePackagePayment> queryAllCoursePackage(Date startTime, Date endTime , Integer coursePackId, Integer stuId, Integer appUserId) { @@ -34,4 +68,91 @@ public Integer queryCountNumber(Integer coursePackageId) { return this.baseMapper.queryCountNumber(coursePackageId); } @Override public List<AppUserVideoResponse> queryAfterVideo(CourseOfAfterRequest search,List<Integer> courseIds) { List<AppUserVideoResponse> responses = new ArrayList<>(); List<PostCourseVideo> videoList = pcvMapper.queryPostCourseVideolist(courseIds); if (videoList.size() > 0){ List<Integer> videoIds = videoList.stream().map(PostCourseVideo::getCourseId).collect(Collectors.toList()); List<UserVideoDetails> userVideoDetails = uvdmapper.queryAppUserWatchVideo(videoIds); if (userVideoDetails.size() > 0){ for (UserVideoDetails userVideoDetail : userVideoDetails) { AppUserVideoResponse response = new AppUserVideoResponse(); TCoursePackage coursePackage = tcpmapper.selectById(userVideoDetail.getCoursePackageId()); response.setPackageName(coursePackage.getName()); response.setCoursePackageId(userVideoDetail.getCoursePackageId()); BenefitsVideos videosWithIds = bfvoClient.getVideosWithIds(userVideoDetail.getCourseId()); response.setVideoId(userVideoDetail.getCourseId()); response.setCoverImage(videosWithIds.getCover()); if (null != search.getSearch()){ // 根据正则模糊匹配 String pattern = ".*" + search.getSearch() + ".*"; Pattern regex = Pattern.compile(pattern); Matcher matcher = regex.matcher(videosWithIds.getName()); if (matcher.matches()) { response.setVideoName(videosWithIds.getName()); } }else { response.setVideoName(videosWithIds.getName()); } response.setSynopsis(videosWithIds.getIntroduction()); response.setIntegral(videosWithIds.getIntegral()); response.setStudyStatus(userVideoDetail.getState()); responses.add(response); } Collections.sort(responses, Comparator.comparing(AppUserVideoResponse::getStudyStatus)); } } return responses; } @Override public CourseOfVideoResponse queryVideoDetails(CourseWithDetailsRequest detailsRequest,Integer appUserId) { CourseOfVideoResponse response = new CourseOfVideoResponse(); BenefitsVideos videosWithIds = bfvoClient.getVideosWithIds(detailsRequest.getVideoId()); TCoursePackage coursePackage = tcpmapper.selectById(detailsRequest.getCoursePackageId()); if (null != videosWithIds && null != coursePackage){ response.setCoursePackageId(coursePackage.getId()); response.setVideoId(videosWithIds.getId()); response.setVideoURL(videosWithIds.getVideos()); response.setVideoName(videosWithIds.getName()); response.setIntegral(videosWithIds.getIntegral()); UserVideoDetails userVideoDetails = uvdmapper.selectOne(new QueryWrapper<UserVideoDetails>() .eq("appUserId",appUserId ) .eq("coursePackageId",coursePackage.getId()) .eq("courseId",videosWithIds.getId())); response.setStudyStatus(userVideoDetails.getState()); response.setPackageName(coursePackage.getName()); response.setSynopsis(videosWithIds.getIntroduction()); response.setDetailedDiagram(coursePackage.getIntroduceDrawing()); } return response; } @Override public String updateVideoStatus(UpdateCourseVideoStatusRequest detailsRequest, Integer appUserId) { UserVideoDetails userVideoDetails = uvdmapper.selectOne(new QueryWrapper<UserVideoDetails>() .eq("appUserId",appUserId ) .eq("coursePackageId",detailsRequest.getCoursePackageId()) .eq("courseId",detailsRequest.getVideoId()) ); if (null != userVideoDetails && userVideoDetails.getState() ==1 && detailsRequest.getIsOver() == 1){ userVideoDetails.setState(2); userVideoDetails.setUpdateTime(new Date()); uvdmapper.updateById(userVideoDetails); return "SUCCESS"; } return null; } @Override public List<RegisterCourseVo> queryRegisteredCourseList(CourseOfAfterRequest courseTypeId, Integer appUserId) { // TODO: 2023/7/6 已报名课程列表 return null; } } cloud-server-course/src/main/java/com/dsh/course/service/impl/UserVideoDetailsServiceImpl.java
New file @@ -0,0 +1,20 @@ package com.dsh.course.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dsh.course.entity.UserVideoDetails; import com.dsh.course.mapper.UserVideoDetailsMapper; import com.dsh.course.service.UserVideoDetailsService; import org.springframework.stereotype.Service; /** * <p> * 用户观看视频记录 服务实现类 * </p> * * @author jqs * @since 2023-07-06 */ @Service public class UserVideoDetailsServiceImpl extends ServiceImpl<UserVideoDetailsMapper, UserVideoDetails> implements UserVideoDetailsService { } cloud-server-course/src/main/resources/mapper/CoursePackageStudentMapper.xml
@@ -32,4 +32,33 @@ and appUserId = #{appUserId} </if> </select> <select id="queryAppUserOfStuAttendClass" resultType="com.dsh.course.entity.CoursePackageStudent"> SELECT * FROM t_course_package_student UNION ALL SELECT * FROM t_course_package_student1 UNION ALL SELECT * FROM t_course_package_student2 UNION ALL SELECT * FROM t_course_package_student3 UNION ALL SELECT * FROM t_course_package_student4 UNION ALL SELECT * FROM t_course_package_student5 WHERE signInOrNot = 1 and reservationStatus = 1 <if test=" appUserId != null"> and appUserId = #{appUserId} </if> <if test="coursePackageIds.size >0"> and coursePackageId in <foreach collection="coursePackageIds" close=")" index="index" open="(" separator="," item="item"> #{item} </foreach> </if> </select> </mapper> cloud-server-course/src/main/resources/mapper/PostCourseVideoMapper.xml
@@ -2,4 +2,30 @@ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.dsh.course.mapper.PostCourseVideoMapper"> <select id="queryPostCourseVideolist" resultType="com.dsh.course.entity.PostCourseVideo"> SELECT * FROM t_post_course_video UNION ALL SELECT * FROM t_post_course_video1 UNION ALL SELECT * FROM t_post_course_video2 UNION ALL SELECT * FROM t_post_course_video3 UNION ALL SELECT * FROM t_post_course_video4 UNION ALL SELECT * FROM t_post_course_video5 WHERE 1 = 1 <if test="courseIds.size > 0 "> and coursePackageId in <foreach collection="courseIds" item="item" separator="," open="(" index="index" close=")"> #{item} </foreach> </if> </select> </mapper> cloud-server-course/src/main/resources/mapper/UserVideoDetailsMapper.xml
New file @@ -0,0 +1,32 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.dsh.course.mapper.UserVideoDetailsMapper"> <select id="queryAppUserWatchVideo" resultType="com.dsh.course.entity.UserVideoDetails"> SELECT * FROM t_user_video_details UNION ALL SELECT * FROM t_user_video_details1 UNION ALL SELECT * FROM t_user_video_details2 UNION ALL SELECT * FROM t_user_video_details3 UNION ALL SELECT * FROM t_user_video_details4 UNION ALL SELECT * FROM t_user_video_details5 WHERE 1=1 <if test="videoIds.size > 0 "> and courseId in <foreach collection="videoIds" item="item" separator="," open="(" index="index" close=")"> #{item} </foreach> </if> </select> </mapper>