Prechádzať zdrojové kódy

红德堂-定时发布课程小节

Long 2 týždňov pred
rodič
commit
959cbfc977

+ 11 - 3
fs-admin/src/main/java/com/fs/course/controller/FsUserCourseVideoController.java

@@ -10,6 +10,7 @@ import com.fs.common.core.domain.model.LoginUser;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.date.DateUtil;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.FsUserCourse;
@@ -20,6 +21,7 @@ import com.fs.course.param.BatchVideoSvae;
 import com.fs.course.param.CourseVideoUpdates;
 import com.fs.course.service.IFsUserCourseService;
 import com.fs.course.service.IFsUserCourseVideoService;
+import com.fs.course.service.IFsUserCourseVideoTaskService;
 import com.fs.course.vo.FsUserCourseVideoChooseVO;
 import com.fs.framework.web.service.TokenService;
 import com.fs.his.vo.OptionsVO;
@@ -31,9 +33,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * 课堂视频Controller
@@ -57,6 +57,8 @@ public class FsUserCourseVideoController extends BaseController
 
     @Autowired
     private ISysConfigService configService;
+    @Autowired
+    private IFsUserCourseVideoTaskService fsUserCourseVideoTaskService;
 
     /**
      * 查询课堂视频列表
@@ -147,6 +149,12 @@ public class FsUserCourseVideoController extends BaseController
     @PutMapping
     public AjaxResult edit(@RequestBody FsUserCourseVideo fsUserCourseVideo)
     {
+        if (Objects.nonNull(fsUserCourseVideo.getPlanReleaseTime())) {
+            if (DateUtil.compareTime(fsUserCourseVideo.getPlanReleaseTime(), new Date())) {
+                return AjaxResult.error("发布时间必须大于当前时间");
+            }
+            return toAjax(fsUserCourseVideoTaskService.addTask(fsUserCourseVideo));
+        }
         return toAjax(fsUserCourseVideoService.updateFsUserCourseVideo(fsUserCourseVideo));
     }
 

+ 50 - 0
fs-admin/src/main/java/com/fs/course/controller/FsUserCourseVideoTaskController.java

@@ -0,0 +1,50 @@
+package com.fs.course.controller;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.course.domain.FsUserCourseVideoTask;
+import com.fs.course.service.IFsUserCourseVideoTaskService;
+import lombok.AllArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@AllArgsConstructor
+@RestController
+@RequestMapping("/course/userCourseVideoTask")
+public class FsUserCourseVideoTaskController extends BaseController {
+
+    private final IFsUserCourseVideoTaskService fsUserCourseVideoTaskService;
+
+    @GetMapping("/list")
+    public TableDataInfo list(@RequestParam Long videoId) {
+        Wrapper<FsUserCourseVideoTask> queryWrapper = Wrappers.<FsUserCourseVideoTask>lambdaQuery()
+                .eq(FsUserCourseVideoTask::getVideoId, videoId)
+                .orderByAsc(FsUserCourseVideoTask::getReleaseStatus)
+                .orderByDesc(FsUserCourseVideoTask::getReleaseTime)
+                .orderByAsc(FsUserCourseVideoTask::getPlanReleaseTime);
+
+        startPage();
+        List<FsUserCourseVideoTask> list = fsUserCourseVideoTaskService.list(queryWrapper);
+        return getDataTable(list);
+    }
+
+    @PreAuthorize("@ss.hasPermi('course:userCourseVideoTask:abandon')")
+    @Log(title = "定时发布小节", businessType = BusinessType.UPDATE)
+    @PutMapping("/abandon/{id}")
+    public AjaxResult abandon(@PathVariable Long id) {
+        FsUserCourseVideoTask task = fsUserCourseVideoTaskService.getById(id);
+        if (task != null) {
+            task.setReleaseStatus(3);
+            fsUserCourseVideoTaskService.updateById(task);
+        }
+        return AjaxResult.success();
+    }
+
+}

+ 35 - 0
fs-admin/src/main/java/com/fs/task/FsCourseVideoTask.java

@@ -0,0 +1,35 @@
+package com.fs.task;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fs.common.utils.date.DateUtil;
+import com.fs.course.domain.FsUserCourseVideoTask;
+import com.fs.course.service.IFsUserCourseVideoTaskService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@AllArgsConstructor
+@Component("courseVideoTask")
+@Slf4j
+public class FsCourseVideoTask {
+
+    private final IFsUserCourseVideoTaskService fsUserCourseVideoTaskService;
+
+    // 定时发布更新视频小节
+    public void releaseCourseVideo() {
+        Wrapper<FsUserCourseVideoTask> queryWrapper = Wrappers.<FsUserCourseVideoTask>lambdaQuery()
+                .eq(FsUserCourseVideoTask::getReleaseStatus, 1)
+                .le(FsUserCourseVideoTask::getPlanReleaseTime, DateUtil.getDate());
+        List<FsUserCourseVideoTask> list = fsUserCourseVideoTaskService.list(queryWrapper);
+        list.forEach(fsUserCourseVideoTask -> {
+            try {
+                fsUserCourseVideoTaskService.releaseCourseVideo(fsUserCourseVideoTask);
+            } catch (Exception e) {
+                log.error("定时发布失败: err={}", e.getMessage(), e);
+            }
+        });
+    }
+}

+ 4 - 0
fs-service/src/main/java/com/fs/course/domain/FsUserCourseVideo.java

@@ -7,6 +7,7 @@ import lombok.Data;
 
 import java.math.BigDecimal;
 import java.time.LocalTime;
+import java.util.Date;
 
 /**
  * 课堂视频对象 fs_user_course_video
@@ -120,4 +121,7 @@ public class FsUserCourseVideo extends BaseEntity
      * 备注
      */
     private  String  remark;
+
+    // 计划发布时间(非数据库字段)
+    private Date planReleaseTime;
 }

+ 146 - 0
fs-service/src/main/java/com/fs/course/domain/FsUserCourseVideoTask.java

@@ -0,0 +1,146 @@
+package com.fs.course.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.time.LocalTime;
+import java.util.Date;
+
+/**
+ * 课堂视频定时任务对象
+ */
+@Data
+@TableName("fs_user_course_video_task")
+public class FsUserCourseVideoTask
+{
+    // 主键ID
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    // 课堂视频实体开始
+
+    /** ID */
+    private Long videoId;
+
+    /** 腾讯vod文件id */
+    @Excel(name = "腾讯vod文件id")
+    private String fileId;
+
+    /** 视频标题 */
+    @Excel(name = "视频标题")
+    private String title;
+
+    /** 视频描述 */
+    @Excel(name = "视频描述")
+    private String description;
+
+    /** 视频URL */
+    @Excel(name = "视频URL")
+    private String videoUrl;
+
+    /** 视频缩略图 */
+    @Excel(name = "视频缩略图")
+    private String thumbnail;
+
+    /** 视频时长 */
+    @Excel(name = "视频时长")
+    private Long duration;
+
+    /** 达人id */
+    @Excel(name = "达人id")
+    private Long talentId;
+
+    /** 课程ID */
+    @Excel(name = "课程ID")
+    private Long courseId;
+
+    /** 视频状态 1:草稿,2:待审核,3:发布 */
+    @Excel(name = "视频状态 1:草稿,2:待审核,3:发布")
+    private Long status;
+
+    /** 课程排序 */
+    @Excel(name = "课程排序")
+    private Long courseSort;
+
+    private String fileName;
+
+    private Integer isDel;
+
+    /**
+     *  课题数组
+     */
+    private String questionBankId;
+
+    private String lineOne; //线路一 腾讯云pcdn 前缀tcpv
+
+    private String lineTwo; //线路二 电信 前缀ctev
+    private String lineThree; //线路三 华为云obs
+    private Integer uploadType;
+
+    private BigDecimal redPacketMoney;
+    private Long fileSize;//文件大小  字节
+    private String fileKey;//文件key 对用存储桶
+    private String round;//轮次
+
+
+    private String packageJson;//绑定疗法
+    private Integer isFirst;
+    private Integer isTranscode;//是否转码
+
+    private String transcodeFileKey;//转码的文件key
+
+    @JsonFormat(pattern = "HH:mm:ss")
+    private LocalTime viewStartTime;
+
+    @JsonFormat(pattern = "HH:mm:ss")
+    private LocalTime viewEndTime;
+
+    @JsonFormat(pattern = "HH:mm:ss")
+    private LocalTime lastJoinTime;
+
+    private Long userId;
+
+    /**
+     * 项目ID
+     */
+    private Long projectId;
+    private Integer isProduct;//是否关联拍商品 0:否 1:是
+
+    private Long productId;//拍商品id
+
+    private Long listingStartTime;//商品售卖时间
+
+    private Long listingEndTime;//商品结束售卖时间
+
+    private String jobId;
+
+    private String vid;
+
+    /**
+     * 备注
+     */
+    private  String  remark;
+
+    // 课堂视频实体结束
+
+    // 创建时间
+    private Date createTime;
+    // 修改时间
+    private Date updateTime;
+    // 发布状态 1:待发布,2:已发布,3:已作废
+    private Integer releaseStatus;
+    // 任务创建时间
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date taskCreateTime;
+    // 计划发布时间
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date planReleaseTime;
+    // 实际发布时间
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date releaseTime;
+}

+ 9 - 0
fs-service/src/main/java/com/fs/course/mapper/FsUserCourseVideoTaskMapper.java

@@ -0,0 +1,9 @@
+package com.fs.course.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.course.domain.FsUserCourseVideoTask;
+
+public interface FsUserCourseVideoTaskMapper extends BaseMapper<FsUserCourseVideoTask> {
+
+}

+ 21 - 0
fs-service/src/main/java/com/fs/course/service/IFsUserCourseVideoTaskService.java

@@ -0,0 +1,21 @@
+package com.fs.course.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.course.domain.FsUserCourseVideo;
+import com.fs.course.domain.FsUserCourseVideoTask;
+
+
+public interface IFsUserCourseVideoTaskService extends IService<FsUserCourseVideoTask> {
+
+    /**
+     * 添加任务
+     */
+    boolean addTask(FsUserCourseVideo fsUserCourseVideo);
+
+    /**
+     * 发布课堂视频小节
+     */
+    void releaseCourseVideo(FsUserCourseVideoTask fsUserCourseVideoTask);
+
+}

+ 57 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoTaskServiceImpl.java

@@ -0,0 +1,57 @@
+package com.fs.course.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.utils.bean.BeanUtils;
+import com.fs.common.utils.date.DateUtil;
+import com.fs.course.domain.*;
+import com.fs.course.mapper.*;
+import com.fs.course.service.IFsUserCourseVideoService;
+import com.fs.course.service.IFsUserCourseVideoTaskService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+
+@Slf4j
+@Service
+@AllArgsConstructor
+public class FsUserCourseVideoTaskServiceImpl extends ServiceImpl<FsUserCourseVideoTaskMapper, FsUserCourseVideoTask> implements IFsUserCourseVideoTaskService {
+
+    private final IFsUserCourseVideoService fsUserCourseVideoService;
+
+    /**
+     * 添加任务
+     */
+    @Override
+    public boolean addTask(FsUserCourseVideo fsUserCourseVideo) {
+        FsUserCourseVideoTask videoTask = new FsUserCourseVideoTask();
+        BeanUtils.copyProperties(fsUserCourseVideo, videoTask);
+
+        videoTask.setTaskCreateTime(DateUtil.getDate());
+        return save(videoTask);
+    }
+
+    /**
+     * 发布课堂视频小节
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void releaseCourseVideo(FsUserCourseVideoTask fsUserCourseVideoTask) {
+        FsUserCourseVideoTask videoTask = getById(fsUserCourseVideoTask.getId());
+        if (videoTask == null || videoTask.getReleaseStatus() != 1) {
+            return;
+        }
+
+        FsUserCourseVideo userCourseVideo = new FsUserCourseVideo();
+        BeanUtils.copyProperties(fsUserCourseVideoTask, userCourseVideo);
+        int i = fsUserCourseVideoService.updateFsUserCourseVideo(userCourseVideo);
+        if (i > 0) {
+            videoTask.setReleaseStatus(2);
+            videoTask.setReleaseTime(DateUtil.getDate());
+            updateById(videoTask);
+        }
+
+    }
+}
+