yangdamao 1 vuosi sitten
vanhempi
commit
61cf4abe0c
21 muutettua tiedostoa jossa 483 lisäystä ja 33 poistoa
  1. 17 3
      zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserStudyRecordController.java
  2. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/ActivityAdvertisingLocationServiceImpl.java
  3. 27 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseServiceImpl.java
  4. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/mapper/GoodsMapper.java
  5. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IGoodsService.java
  6. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java
  7. 26 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsCourseTreeVo.java
  8. 28 28
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java
  9. 3 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeUserServiceImpl.java
  10. 69 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java
  11. 20 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/tencentcloud/service/impl/FaceOcrServiceImpl.java
  12. 23 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/CheckUserVideoBo.java
  13. 33 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/SaveUserVideoBo.java
  14. 64 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserStudyVideo.java
  15. 15 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserStudyVideoMapper.java
  16. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserStudyRecordService.java
  17. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserStudyVideoService.java
  18. 55 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyRecordServiceImpl.java
  19. 18 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyVideoServiceImpl.java
  20. 51 0
      zhongzheng-system/src/main/resources/mapper/modules/goods/GoodsMapper.xml
  21. 7 0
      zhongzheng-system/src/main/resources/mapper/modules/user/UserStudyVideoMapper.xml

+ 17 - 3
zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserStudyRecordController.java

@@ -12,9 +12,7 @@ import com.zhongzheng.modules.grade.domain.UserPeriodStatus;
 import com.zhongzheng.modules.grade.vo.ClassPeriodVo;
 import com.zhongzheng.modules.polyv.bo.PolyvLiveQueryBo;
 import com.zhongzheng.modules.polyv.service.IPolyvLiveService;
-import com.zhongzheng.modules.user.bo.UserStudyRecordAddBo;
-import com.zhongzheng.modules.user.bo.UserStudyRecordEditBo;
-import com.zhongzheng.modules.user.bo.UserStudyRecordQueryBo;
+import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.domain.UserStudyRecord;
 import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import com.zhongzheng.modules.user.service.IUserStudyRecordService;
@@ -208,4 +206,20 @@ public class UserStudyRecordController extends BaseController {
         bo.setUserId(loginUser.getUser().getUserId());
         return AjaxResult.success(iUserStudyRecordService.syncSevenModulePublicClass(bo.getOrderGoodsId(),bo.getUserId()));
     }
+
+    @ApiOperation("查询当前视频节是否需要录像")
+    @GetMapping("/check/video")
+    public AjaxResult<Void> checkUserVideo(CheckUserVideoBo bo){
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return toAjax(iUserStudyRecordService.checkUserVideo(bo) ? 1 : 0);
+    }
+
+    @ApiOperation("保存当前视频节录像")
+    @GetMapping("/save/video")
+    public AjaxResult<Void> saveUserVideo(SaveUserVideoBo bo){
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return toAjax(iUserStudyRecordService.saveUserVideo(bo) ? 1 : 0);
+    }
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/base/service/impl/ActivityAdvertisingLocationServiceImpl.java

@@ -2,7 +2,9 @@ package com.zhongzheng.modules.base.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.StrUtil;
+import com.zhongzheng.common.type.EncryptHandler;
 import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.common.utils.SecurityUtils;
 import com.zhongzheng.modules.base.bo.ActivityAdvertisingLocationAddBo;
 import com.zhongzheng.modules.base.bo.ActivityAdvertisingLocationEditBo;
 import com.zhongzheng.modules.base.bo.ActivityAdvertisingLocationQueryBo;

+ 27 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseServiceImpl.java

@@ -170,7 +170,8 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
     private String OLD_GOODS;
     @Autowired
     private ClassGradeUserMapper classGradeUserMapper;
-
+    @Autowired
+    private IUserStudyVideoService iUserStudyVideoService;
 
 
     @Override
@@ -459,6 +460,31 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> impleme
             userPeriodStatusAddBo.setUpdateTime(DateUtils.getNowTime());
             userPeriodStatusAddBo.setStatus(3);
             userPeriodStatusService.insertByAddBo(userPeriodStatusAddBo);
+            //处理学习录像
+            UserPeriod userPeriod = iUserPeriodService.getById(goodsPeriodStatusVo.getId());
+            List<UserStudyVideo> list = iUserStudyVideoService.list(new LambdaQueryWrapper<UserStudyVideo>()
+                    .eq(UserStudyVideo::getOrderGoodsId, userPeriod.getOrderGoodsId())
+                    .eq(UserStudyVideo::getUserId, userPeriod.getUserId())
+                    .eq(UserStudyVideo::getGoodsId, userPeriod.getGoodsId())
+                    .eq(UserStudyVideo::getCourseId, userPeriod.getCourseId())
+                    .eq(UserStudyVideo::getModuleId, userPeriod.getModuleId())
+                    .eq(UserStudyVideo::getChapterId, userPeriod.getChapterId())
+                    .eq(UserStudyVideo::getSectionId, userPeriod.getSectionId())
+                    .eq(UserStudyVideo::getCurrentStatus, 1)
+                    .eq(UserStudyVideo::getStatus, 1));
+            if (CollectionUtils.isNotEmpty(list)){
+                list.forEach(x -> x.setCurrentStatus(0));
+                iUserStudyVideoService.updateBatchById(list);
+                //新增一条
+                List<UserStudyVideo> studyVideos = list.stream().map(item -> {
+                    item.setCurrentStatus(1);
+                    item.setVideoCurrentTime(null);
+                    item.setVideoUrl(null);
+                    item.setFromPlat(null);
+                    return item;
+                }).collect(Collectors.toList());
+                iUserStudyVideoService.saveBatch(studyVideos);
+            }
             UserPeriodVo vo = iUserPeriodService.queryById(goodsPeriodStatusVo.getPeriodId());
             LambdaUpdateWrapper<CoursePhotoLog> objectLambdaUpdateWrapper = Wrappers.lambdaUpdate();
             objectLambdaUpdateWrapper.eq(CoursePhotoLog::getUserId, bo.getUserId());

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/mapper/GoodsMapper.java

@@ -135,4 +135,5 @@ public interface GoodsMapper extends BaseMapper<Goods> {
     @InterceptorIgnore(tenantLine = "true")
     List<Exam> getExam();
 
+    List<GoodsCourseTreeVo> getGoodsCourseTree(Long goodsId);
 }

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IGoodsService.java

@@ -172,4 +172,5 @@ public interface IGoodsService extends IService<Goods> {
 
 	String createUserAccount(UserAccountBo bo);
 
+	List<GoodsCourseTreeVo> getGoodsCourseTree(Long goodsId);
 }

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsServiceImpl.java

@@ -5481,6 +5481,11 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
         return url;
     }
 
+    @Override
+    public List<GoodsCourseTreeVo> getGoodsCourseTree(Long goodsId) {
+        return baseMapper.getGoodsCourseTree(goodsId);
+    }
+
     private void updateHandoutsId(Long goodsId, Long tenantId, Long handoutsId) {
         baseMapper.updateHandoutsId(goodsId, tenantId, handoutsId);
     }

+ 26 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsCourseTreeVo.java

@@ -0,0 +1,26 @@
+package com.zhongzheng.modules.goods.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class GoodsCourseTreeVo implements Serializable {
+
+    @ApiModelProperty("")
+    private Long goodsId;
+
+    @ApiModelProperty("")
+    private Long courseId;
+
+    @ApiModelProperty("")
+    private Long moduleId;
+
+    @ApiModelProperty("")
+    private Long chapterId;
+
+    @ApiModelProperty("")
+    private Long sectionId;
+
+}

+ 28 - 28
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java

@@ -1604,34 +1604,34 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         String fullName = iCourseBusinessService.queryFullName(businessQueryBo);
         if (("继续教育二级建造师".equals(fullName)) || ("继续教育二级造价师".equals(fullName))) {
             //继教二建或者继教二造班级
-            ClassGradeVo gradeVo = queryById(gradeId);
-            if (Validator.isNotEmpty(gradeVo) && Validator.isNotEmpty(gradeVo.getOfficialName())) {
-                ClassGradeQueryBo queryBo = new ClassGradeQueryBo();
-                queryBo.setOfficialName(gradeVo.getOfficialName());
-                Integer num = queryOfficialGradeCount(queryBo);
-                List<GradeChangeEjjjPeopleBo> boList = new ArrayList<>();
-                GradeChangeEjjjPeopleBo bo = new GradeChangeEjjjPeopleBo();
-                bo.setOfficialName(gradeVo.getOfficialName());
-                bo.setNum(num);
-                boList.add(bo);
-                //通知旧系统
-                Map<String, String> params = new HashMap<>();
-                Long nowTime = DateUtils.getNowTime();
-                String sign = ToolsUtils.EncoderByMd5(nowTime.toString() + "pubilc2022");
-                params.put("stamp", nowTime.toString());
-                params.put("sign", sign);
-                params.put("jsonstr", JSONArray.toJSONString(boList));
-                String respone = "";
-                try {
-                    respone = HttpUtils.postFormBody(GRADE_CHANGE_PATH, params);
-                    log.info("同步系统班级人数结果" + respone, "");
-                    if (!respone.contains("\"Status\":true")) {
-                        throw new CustomException("旧系统接口请求错误" + respone);
-                    }
-                } catch (IOException e) {
-                    throw new CustomException("旧系统接口请求错误" + e.getMessage());
-                }
-            }
+//            ClassGradeVo gradeVo = queryById(gradeId);
+//            if (Validator.isNotEmpty(gradeVo) && Validator.isNotEmpty(gradeVo.getOfficialName())) {
+//                ClassGradeQueryBo queryBo = new ClassGradeQueryBo();
+//                queryBo.setOfficialName(gradeVo.getOfficialName());
+//                Integer num = queryOfficialGradeCount(queryBo);
+//                List<GradeChangeEjjjPeopleBo> boList = new ArrayList<>();
+//                GradeChangeEjjjPeopleBo bo = new GradeChangeEjjjPeopleBo();
+//                bo.setOfficialName(gradeVo.getOfficialName());
+//                bo.setNum(num);
+//                boList.add(bo);
+//                //通知旧系统
+//                Map<String, String> params = new HashMap<>();
+//                Long nowTime = DateUtils.getNowTime();
+//                String sign = ToolsUtils.EncoderByMd5(nowTime.toString() + "pubilc2022");
+//                params.put("stamp", nowTime.toString());
+//                params.put("sign", sign);
+//                params.put("jsonstr", JSONArray.toJSONString(boList));
+//                String respone = "";
+//                try {
+//                    respone = HttpUtils.postFormBody(GRADE_CHANGE_PATH, params);
+//                    log.info("同步系统班级人数结果" + respone, "");
+//                    if (!respone.contains("\"Status\":true")) {
+//                        throw new CustomException("旧系统接口请求错误" + respone);
+//                    }
+//                } catch (IOException e) {
+//                    throw new CustomException("旧系统接口请求错误" + e.getMessage());
+//                }
+//            }
 
         }
         return true;

+ 3 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeUserServiceImpl.java

@@ -3384,7 +3384,9 @@ public class ClassGradeUserServiceImpl extends ServiceImpl<ClassGradeUserMapper,
             if (classPeriodVo.getType() == 1) {
                 moduleTotal++;
                 CourseModuleVo moduleVo = iCourseModuleService.queryById(classPeriodVo.getId());
-                classPeriodVo.setCommonGradeName(commonGradeName);
+                if (moduleVo.getCommonSign() == 1){
+                    classPeriodVo.setCommonGradeName(commonGradeName);
+                }
                 List<ClassPeriodChapterVo> classPeriodChapterVos = baseMapper.listperiodChapter(classPeriodVo.getId(), bo.getGoodsId(), classPeriodVo.getCourseId(), bo.getUserId(), bo.getGradeId(),bo.getOrderGoodsId());
                 Collections.sort(classPeriodChapterVos);
                 classPeriodChapterVos.addAll(baseMapper.listperiodModuleExam(bo.getGoodsId(), classPeriodVo.getCourseId(), bo.getUserId(), classPeriodVo.getId()));

+ 69 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java

@@ -46,6 +46,7 @@ import com.zhongzheng.modules.goods.service.IGoodsFreeBankService;
 import com.zhongzheng.modules.goods.service.IGoodsQuestionRelService;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.service.IQuestionMerchantService;
+import com.zhongzheng.modules.goods.vo.GoodsCourseTreeVo;
 import com.zhongzheng.modules.goods.vo.QuestionOpenImportVo;
 import com.zhongzheng.modules.grade.bo.*;
 import com.zhongzheng.modules.grade.domain.*;
@@ -80,9 +81,11 @@ import com.zhongzheng.modules.top.settle.domian.TopInstSettle;
 import com.zhongzheng.modules.top.settle.service.ITopInstSettleService;
 import com.zhongzheng.modules.user.domain.User;
 import com.zhongzheng.modules.user.domain.UserExamGoods;
+import com.zhongzheng.modules.user.domain.UserStudyVideo;
 import com.zhongzheng.modules.user.domain.UserSubscribe;
 import com.zhongzheng.modules.user.service.IUserExamGoodsService;
 import com.zhongzheng.modules.user.service.IUserService;
+import com.zhongzheng.modules.user.service.IUserStudyVideoService;
 import com.zhongzheng.modules.user.service.IUserSubscribeService;
 import com.zhongzheng.modules.user.vo.UserVo;
 import com.zhongzheng.modules.wx.service.IWxPayService;
@@ -213,6 +216,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     private ISysOldOrgService iSysOldOrgService;
     @Autowired
     private ISysTenantService iSysTenantService;
+    @Autowired
+    private IUserStudyVideoService iUserStudyVideoService;
     @Value("${oldStudySys.createExamPath}")
     private String CREATE_EXAM_PATH;
 
@@ -600,6 +605,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             //暂不计算优惠券
             payPrice = payPrice.add(g.getGoodsPrice());
             boolean orderGoodsRs = iOrderGoodsService.save(orderGoods);
+            //二建课程设置课程录像
+            setCourseVideo(bo.getUserId(),g.getGoodsId(),orderGoods.getOrderGoodsId());
             boolean canRepeatBuy = false;
             validUserBeforeBuy(goods, bo.getUserId());
             //判断视频/题库商品是否有购买过,服务期是否过期
@@ -675,6 +682,60 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         return result;
     }
 
+    private void setCourseVideo(Long userId, Long goodsId, Long orderGoodsId) {
+        String businessName = iGoodsService.getBusinessName(goodsId);
+        List<String> list = Arrays.asList("继续教育二级建造师", "继续教育二级造价师");
+        if (!list.contains(businessName)){
+            return;
+        }
+        //随便抽取3到5个视频录像
+        List<GoodsCourseTreeVo> treeVos = iGoodsService.getGoodsCourseTree(goodsId);
+        if (CollectionUtils.isEmpty(treeVos)){
+            return;
+        }
+        int[] numbers = {3, 4, 5, 6}; // 这是你的数字集合
+        Random random = new Random();
+        // 随机获取一个索引
+        int index = random.nextInt(numbers.length);
+        // 获取该索引对应的数字
+        int randomNumber = numbers[index];
+
+        List<GoodsCourseTreeVo> treeVoList = new ArrayList<>();
+        List<Integer> numList = new ArrayList<>();
+        Integer number = treeVos.size() > randomNumber ? randomNumber: treeVos.size();
+        for (int i = 0; i < number; i++) {
+            Random random2 = new Random();
+            // 随机获取一个索引
+            int index2 = random2.nextInt(treeVos.size());
+            if (CollectionUtils.isNotEmpty(numList)){
+                //已存在
+                while (numList.contains(index2)){
+                    Random random3 = new Random();
+                    // 随机获取一个索引
+                    index2 = random3.nextInt(treeVos.size());
+                }
+            }
+            treeVoList.add(treeVos.get(index2));
+            numList.add(index2);
+        }
+        List<UserStudyVideo> studyVideos = treeVoList.stream().map(item -> {
+            UserStudyVideo video = new UserStudyVideo();
+            video.setUserId(userId);
+            video.setGoodsId(goodsId);
+            video.setOrderGoodsId(orderGoodsId);
+            video.setCourseId(item.getCourseId());
+            video.setModuleId(item.getModuleId());
+            video.setChapterId(item.getChapterId());
+            video.setSectionId(item.getSectionId());
+            video.setStatus(1);
+            video.setCurrentStatus(1);
+            video.setCreateTime(DateUtils.getNowTime());
+            video.setUpdateTime(DateUtils.getNowTime());
+            return video;
+        }).collect(Collectors.toList());
+        iUserStudyVideoService.saveBatch(studyVideos);
+    }
+
     /**
      * 系统录单
      *
@@ -776,6 +837,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             //已收价格
             receivedPrice = receivedPrice.add(g.getGoodsReceived());
             boolean orderGoodsRs = iOrderGoodsService.save(orderGoods);
+            //二建课程设置课程录像
+            setCourseVideo(bo.getUserId(),g.getGoodsId(),orderGoods.getOrderGoodsId());
             boolean canRepeatBuy = false;
             validUserBeforeBuy(goods, bo.getUserId());
             //判断是否有购买过
@@ -1450,6 +1513,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                 payPrice = payPrice.add(goods.getStandPrice());
             }
             boolean orderGoodsRs = iOrderGoodsService.save(orderGoods);
+            //二建课程设置课程录像
+            setCourseVideo(bo.getUserId(),g.getGoodsId(),orderGoods.getOrderGoodsId());
             if (ObjectUtils.isNotNull(g.getRelevanceId())){
                 //购买关联题库商品
                 questionOrderHandle(g.getRelevanceId(),g.getGoodsId(),orderGoods.getOrderGoodsId(),bo.getUserId());
@@ -1894,6 +1959,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                 payPrice = payPrice.add(goods.getStandPrice());
             }
             boolean orderGoodsRs = iOrderGoodsService.save(orderGoods);
+            //二建课程设置课程录像
+            setCourseVideo(bo.getUserId(),g.getGoodsId(),orderGoods.getOrderGoodsId());
             if (ObjectUtils.isNotNull(g.getRelevanceId())){
                 //购买关联题库商品
                 questionOrderHandle(g.getRelevanceId(),g.getGoodsId(),orderGoods.getOrderGoodsId(),bo.getUserId());
@@ -2095,6 +2162,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             //暂不计算优惠券
             payPrice = payPrice.add(goods.getStandPrice());
             boolean orderGoodsRs = iOrderGoodsService.save(orderGoods);
+            //二建课程设置课程录像
+            setCourseVideo(bo.getUserId(),g.getGoodsId(),orderGoods.getOrderGoodsId());
             if (ObjectUtils.isNotNull(g.getRelevanceId())){
                 //购买关联题库商品
                 questionOrderHandle(g.getRelevanceId(),g.getGoodsId(),orderGoods.getOrderGoodsId(),bo.getUserId());

+ 20 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/tencentcloud/service/impl/FaceOcrServiceImpl.java

@@ -3,6 +3,7 @@ package com.zhongzheng.modules.tencentcloud.service.impl;
 
 import cn.hutool.core.lang.Validator;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.tencentcloudapi.bda.v20200324.models.SegmentPortraitPicRequest;
 import com.tencentcloudapi.common.Credential;
 import com.tencentcloudapi.common.exception.TencentCloudSDKException;
@@ -149,6 +150,25 @@ public class FaceOcrServiceImpl implements IFaceOcrService {
                 log.info("照片五官不达标");
                 throw new CustomException("照片五官不达标");
             }
+            FaceQualityCompleteness completeness = face[0].getFaceQualityInfo().getCompleteness();
+            if (ObjectUtils.isNull(completeness.getEyebrow()) || completeness.getEyebrow() < 80){
+                throw new CustomException("请勿遮挡眉毛");
+            }
+            if (ObjectUtils.isNull(completeness.getEye()) || completeness.getEye() < 80){
+                throw new CustomException("请勿遮挡眼睛");
+            }
+            if (ObjectUtils.isNull(completeness.getNose()) || completeness.getNose() < 60){
+                throw new CustomException("请勿遮挡鼻子");
+            }
+            if (ObjectUtils.isNull(completeness.getCheek()) || completeness.getCheek() < 70){
+                throw new CustomException("请勿遮挡脸颊");
+            }
+            if (ObjectUtils.isNull(completeness.getMouth()) || completeness.getMouth() < 50){
+                throw new CustomException("请勿遮挡嘴巴");
+            }
+            if (ObjectUtils.isNull(completeness.getChin()) || completeness.getChin() < 60){
+                throw new CustomException("请勿遮挡下巴");
+            }
         }catch (TencentCloudSDKException e){
             log.info("人脸检测错误"+e.getMessage());
             throw new CustomException("人脸检测错误"+e.getMessage());

+ 23 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/CheckUserVideoBo.java

@@ -0,0 +1,23 @@
+package com.zhongzheng.modules.user.bo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class CheckUserVideoBo implements Serializable {
+
+    private Long userId;
+
+    private Long orderGoodsId;
+
+    private Long goodsId;
+
+    private Long courseId;
+
+    private Long moduleId;
+
+    private Long chapterId;
+
+    private Long sectionId;
+}

+ 33 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/SaveUserVideoBo.java

@@ -0,0 +1,33 @@
+package com.zhongzheng.modules.user.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class SaveUserVideoBo implements Serializable {
+
+    private Long userId;
+
+    private Long orderGoodsId;
+
+    private Long goodsId;
+
+    private Long courseId;
+
+    private Long moduleId;
+
+    private Long chapterId;
+
+    private Long sectionId;
+
+    @ApiModelProperty("视频当前播放时刻")
+    private Long videoCurrentTime;
+
+    @ApiModelProperty("来源平台 1小程序 2PC网站 3h5")
+    private Integer fromPlat;
+
+    @ApiModelProperty("视频地址")
+    private String videoUrl;
+}

+ 64 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserStudyVideo.java

@@ -0,0 +1,64 @@
+package com.zhongzheng.modules.user.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 用户学习记录对象 user_study_record
+ *
+ * @author ruoyi
+ * @date 2021-12-16
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("user_study_video")
+public class UserStudyVideo implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** 学习记录ID */
+    @TableId(value = "video_id")
+    private Long videoId;
+    /** $column.columnComment */
+    private Long userId;
+    /** 订单商品ID */
+    private Long orderGoodsId;
+    /** 商品Id */
+    private Long goodsId;
+    /** 课程ID */
+    private Long courseId;
+    /** 模块ID */
+    private Long moduleId;
+    /** 章ID */
+    private Long chapterId;
+    /** 节ID */
+    private Long sectionId;
+    /** 视频当前播放时刻 */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Long videoCurrentTime;
+    /**  来源平台 1小程序 2网站 */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Integer fromPlat;
+    /** 当前状态 1 当前状态 0过往状态 */
+    private Integer currentStatus;
+    /** 视频地址 */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private String videoUrl;
+    /** 0无效 1有效 */
+    private Integer status;
+    /** 创建时间 */
+    private Long tenantId;
+    /** 商户ID */
+    private Long createTime;
+    /** 修改时间 */
+    private Long updateTime;
+
+}

+ 15 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserStudyVideoMapper.java

@@ -0,0 +1,15 @@
+package com.zhongzheng.modules.user.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.user.domain.UserStudyVideo;
+
+/**
+ * 【请填写功能名称】Mapper接口
+ *
+ * @author change
+ * @date 2021-06-24
+ */
+public interface UserStudyVideoMapper extends BaseMapper<UserStudyVideo> {
+
+}

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserStudyRecordService.java

@@ -161,4 +161,8 @@ public interface IUserStudyRecordService extends IService<UserStudyRecord> {
 	Boolean syncUserDateStudyLog();
 
     List<UserStudyRecord> getStudyRecordNoTenant(Long orderGoodsId);
+
+    boolean checkUserVideo(CheckUserVideoBo bo);
+
+	boolean saveUserVideo(SaveUserVideoBo bo);
 }

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserStudyVideoService.java

@@ -0,0 +1,14 @@
+package com.zhongzheng.modules.user.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.user.domain.UserStudyVideo;
+
+/**
+ * 【请填写功能名称】Service接口
+ *
+ * @author ruoyi
+ * @date 2021-06-24
+ */
+public interface IUserStudyVideoService extends IService<UserStudyVideo> {
+
+}

+ 55 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyRecordServiceImpl.java

@@ -174,6 +174,9 @@ public class UserStudyRecordServiceImpl extends ServiceImpl<UserStudyRecordMappe
     @Autowired
     private ICourseMenuService iCourseMenuService;
 
+    @Autowired
+    private IUserStudyVideoService iUserStudyVideoService;
+
 
     @Value("${fileHost}")
     private String fileHost;
@@ -1664,6 +1667,58 @@ public class UserStudyRecordServiceImpl extends ServiceImpl<UserStudyRecordMappe
         return baseMapper.getStudyRecordNoTenant(orderGoodsId);
     }
 
+    @Override
+    public boolean checkUserVideo(CheckUserVideoBo bo) {
+        User user = iUserService.getById(bo.getUserId());
+        if (ObjectUtils.isNull(user)){
+            throw new CustomException("用户不存在,请检查!");
+        }
+        OrderGoods orderGoods = iOrderGoodsService.getById(bo.getGoodsId());
+        if (ObjectUtils.isNull(orderGoods)){
+            throw new CustomException("订单不存在,请检查!");
+        }
+        int count = iUserStudyVideoService.count(new LambdaQueryWrapper<UserStudyVideo>()
+                .eq(UserStudyVideo::getUserId, bo.getUserId())
+                .eq(UserStudyVideo::getOrderGoodsId, bo.getOrderGoodsId())
+                .eq(UserStudyVideo::getGoodsId, bo.getGoodsId())
+                .eq(UserStudyVideo::getCourseId, bo.getCourseId())
+                .eq(UserStudyVideo::getModuleId, bo.getModuleId())
+                .eq(UserStudyVideo::getChapterId, bo.getChapterId())
+                .eq(UserStudyVideo::getSectionId, bo.getSectionId())
+                .eq(UserStudyVideo::getCurrentStatus, 1)
+                .eq(UserStudyVideo::getStatus, 1));
+        return count > 0;
+    }
+
+    @Override
+    public boolean saveUserVideo(SaveUserVideoBo bo) {
+        User user = iUserService.getById(bo.getUserId());
+        if (ObjectUtils.isNull(user)){
+            throw new CustomException("用户不存在,请检查!");
+        }
+        OrderGoods orderGoods = iOrderGoodsService.getById(bo.getGoodsId());
+        if (ObjectUtils.isNull(orderGoods)){
+            throw new CustomException("订单不存在,请检查!");
+        }
+        UserStudyVideo video = iUserStudyVideoService.getOne(new LambdaQueryWrapper<UserStudyVideo>()
+                .eq(UserStudyVideo::getUserId, bo.getUserId())
+                .eq(UserStudyVideo::getOrderGoodsId, bo.getOrderGoodsId())
+                .eq(UserStudyVideo::getGoodsId, bo.getGoodsId())
+                .eq(UserStudyVideo::getCourseId, bo.getCourseId())
+                .eq(UserStudyVideo::getModuleId, bo.getModuleId())
+                .eq(UserStudyVideo::getChapterId, bo.getChapterId())
+                .eq(UserStudyVideo::getSectionId, bo.getSectionId())
+                .eq(UserStudyVideo::getCurrentStatus, 1)
+                .eq(UserStudyVideo::getStatus, 1));
+        if (ObjectUtils.isNull(video)){
+            throw new CustomException("当前视频不存在,请检查!");
+        }
+        video.setVideoCurrentTime(bo.getVideoCurrentTime());
+        video.setFromPlat(bo.getFromPlat());
+        video.setVideoUrl(bo.getVideoUrl());
+        return iUserStudyVideoService.updateById(video);
+    }
+
 
     /**
      * 获取最后一次看完的节

+ 18 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyVideoServiceImpl.java

@@ -0,0 +1,18 @@
+package com.zhongzheng.modules.user.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.modules.user.domain.UserStudyVideo;
+import com.zhongzheng.modules.user.mapper.UserStudyVideoMapper;
+import com.zhongzheng.modules.user.service.IUserStudyVideoService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 【请填写功能名称】Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2021-06-24
+ */
+@Service
+public class UserStudyVideoServiceImpl extends ServiceImpl<UserStudyVideoMapper, UserStudyVideo> implements IUserStudyVideoService {
+
+}

+ 51 - 0
zhongzheng-system/src/main/resources/mapper/modules/goods/GoodsMapper.xml

@@ -1003,6 +1003,57 @@
         VALUES(#{educationTypeId},#{businessId},#{tenantId},#{projectId},#{subjectId},#{majorId},#{type})
     </insert>
 
+    <select id="getGoodsCourseTree" parameterType="java.lang.Long" resultType="com.zhongzheng.modules.goods.vo.GoodsCourseTreeVo">
+        SELECT
+            gc.goods_id,
+            cm.course_id,
+            cmc.module_id,
+            cpc.chapter_id,
+            cs.section_id
+        FROM
+            goods_course gc
+                LEFT JOIN course_menu cm ON gc.course_id = cm.course_id
+                LEFT JOIN course_module_chapter cmc ON cm.menu_id = cmc.module_id
+                LEFT JOIN course_chapter_section cpc ON cmc.chapter_id = cpc.chapter_id
+                LEFT JOIN course_section cs ON cpc.section_id = cs.section_id
+        WHERE
+            gc.goods_id = #{goodsId}
+          AND cm.`status` = 1
+          AND cs.`status` = 1
+          AND cm.type = 1 UNION ALL
+        SELECT
+            gc.goods_id,
+            cm.course_id,
+            0 AS module_id,
+            cpc.chapter_id,
+            cs.section_id
+        FROM
+            goods_course gc
+                LEFT JOIN course_menu cm ON gc.course_id = cm.course_id
+                LEFT JOIN course_chapter_section cpc ON cm.menu_id = cpc.chapter_id
+                LEFT JOIN course_section cs ON cpc.section_id = cs.section_id
+        WHERE
+            gc.goods_id = #{goodsId}
+          AND cm.`status` = 1
+          AND cs.`status` = 1
+          AND cm.type = 2 UNION ALL
+        SELECT
+            gc.goods_id,
+            cm.course_id,
+            0 AS module_id,
+            0 AS chapter_id,
+            cs.section_id
+        FROM
+            goods_course gc
+                LEFT JOIN course_menu cm ON gc.course_id = cm.course_id
+                LEFT JOIN course_section cs ON cm.menu_id = cs.section_id
+        WHERE
+            gc.goods_id = #{goodsId}
+          AND cm.`status` = 1
+          AND cs.`status` = 1
+          AND cm.type = 3
+    </select>
+
     <update id="updateByTenant" parameterType="com.zhongzheng.modules.goods.domain.Goods">
         UPDATE goods
         SET `year`                  = #{year},

+ 7 - 0
zhongzheng-system/src/main/resources/mapper/modules/user/UserStudyVideoMapper.xml

@@ -0,0 +1,7 @@
+<?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.zhongzheng.modules.user.mapper.UserStudyVideoMapper">
+
+</mapper>