lisy
2023-07-06 d061aa842106480f3a8991d83dc3b978441330ab
修改续课详情页面的支付方式展示;开始上课-课后练习接口开发
15个文件已修改
2个文件已删除
23个文件已添加
1220 ■■■■■ 已修改文件
cloud-server-account/src/main/java/com/dsh/account/controller/ClassDetailsController.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-account/src/main/java/com/dsh/account/feignclient/course/CoursePaymentClient.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/CourseTypeResp.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-account/src/main/java/com/dsh/account/feignclient/course/model/PurchaseVo.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-account/src/main/java/com/dsh/account/service/impl/TAppUserServiceImpl.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-account/src/main/java/com/dsh/account/service/impl/TStudentServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-activity/src/main/java/com/dsh/activity/controller/BenefitVideoController.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-activity/src/main/java/com/dsh/activity/entity/BenefitsVideos.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-activity/src/main/java/com/dsh/activity/feignclient/BenefitVideoClient.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-activity/src/main/java/com/dsh/activity/mapper/BenefitsVideosMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-activity/src/main/java/com/dsh/activity/service/BenefitsVideosService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-activity/src/main/java/com/dsh/activity/service/impl/BenefitsVideosServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-activity/src/main/java/com/dsh/activity/web/PointsMerchandiseController.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-activity/src/main/resources/mapper/BenefitsVideosMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/controller/CoursePackagePaymentController.java 226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/entity/TCoursePackagePayment.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/entity/UserVideoDetails.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/feignclient/CoursePaymentClient.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/BenefitVideoClient.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/feignclient/activity/model/BenefitsVideos.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/feignclient/model/PurchaseVo.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/mapper/CoursePackageStudentMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/mapper/PostCourseVideoMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/mapper/UserVideoDetailsMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/model/vo/RegisterCourseVo.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/model/vo/StuCourseRequest.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/model/vo/request/CourseOfAfterRequest.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/model/vo/request/CourseWithDetailsRequest.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/model/vo/request/UpdateCourseVideoStatusRequest.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/model/vo/response/AppUserVideoResponse.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/model/vo/response/CourseOfVideoResponse.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/service/CoursePackageStudentService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/service/TCoursePackagePaymentService.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/service/UserVideoDetailsService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/service/impl/CoursePackageStudentServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/service/impl/TCoursePackagePaymentServiceImpl.java 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/service/impl/UserVideoDetailsServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/resources/mapper/CoursePackageStudentMapper.xml 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/resources/mapper/PostCourseVideoMapper.xml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/resources/mapper/UserVideoDetailsMapper.xml 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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>