Sfoglia il codice sorgente

content-service/vod 中添加一个 PlayComplete 记录播放完成的视频, 不再使用 PlayRecord 中的 ended 字段

reghao 7 mesi fa
parent
commit
1f18d4ff37

+ 13 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/db/mapper/PlayCompleteMapper.java

@@ -0,0 +1,13 @@
+package cn.reghao.tnb.content.app.vod.db.mapper;
+
+import cn.reghao.jutil.jdk.db.BaseMapper;
+import cn.reghao.tnb.content.app.vod.model.po.PlayComplete;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author reghao
+ * @date 2025-08-03 12:27:01
+ */
+@Mapper
+public interface PlayCompleteMapper extends BaseMapper<PlayComplete> {
+}

+ 26 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/model/po/PlayComplete.java

@@ -0,0 +1,26 @@
+package cn.reghao.tnb.content.app.vod.model.po;
+
+import cn.reghao.jutil.jdk.db.BaseObject;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * @author reghao
+ * @date 2025-08-03 12:26:06
+ */
+@NoArgsConstructor
+@Getter
+@Setter
+public class PlayComplete extends BaseObject<Integer> {
+    private Long userId;
+    private String videoId;
+    // ms 时间戳
+    private Long createAt;
+
+    public PlayComplete(PlayRecord playRecord) {
+        this.userId = playRecord.getUserId();
+        this.videoId = playRecord.getVideoId();
+        this.createAt = playRecord.getCreateAt();
+    }
+}

+ 16 - 4
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/impl/VideoPlayServiceImpl.java

@@ -8,10 +8,12 @@ import cn.reghao.tnb.content.api.constant.PostScope;
 import cn.reghao.tnb.content.api.dto.VideoRecord;
 import cn.reghao.tnb.content.api.dto.VideoUrl;
 import cn.reghao.tnb.content.api.dto.VideoUrls;
+import cn.reghao.tnb.content.app.vod.db.mapper.PlayCompleteMapper;
 import cn.reghao.tnb.content.app.vod.db.mapper.PlayRecordMapper;
 import cn.reghao.tnb.content.app.vod.db.mapper.VideoPostMapper;
 import cn.reghao.tnb.content.app.vod.db.mapper.VideoPostTagMapper;
 import cn.reghao.tnb.content.app.vod.db.repository.VideoRepository;
+import cn.reghao.tnb.content.app.vod.model.po.PlayComplete;
 import cn.reghao.tnb.content.app.vod.model.po.PlayRecord;
 import cn.reghao.tnb.content.app.vod.model.po.VideoPost;
 import cn.reghao.tnb.content.api.dto.VideoRecordCard;
@@ -23,6 +25,7 @@ import cn.reghao.tnb.user.api.dto.UserCard;
 import cn.reghao.tnb.user.api.iface.UserService;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.HashSet;
 import java.util.List;
@@ -48,16 +51,19 @@ public class VideoPlayServiceImpl implements VideoPlayService {
     private final VideoPostTagMapper videoPostTagMapper;
     private final UserInterestBased userInterestBased;
     private final ContentPermission contentPermission;
+    private PlayCompleteMapper playCompleteMapper;
 
     public VideoPlayServiceImpl(VideoPostMapper videoPostMapper, PlayRecordMapper playRecordMapper,
                                 VideoRepository videoRepository, VideoPostTagMapper videoPostTagMapper,
-                                UserInterestBased userInterestBased, ContentPermission contentPermission) {
+                                UserInterestBased userInterestBased, ContentPermission contentPermission,
+                                PlayCompleteMapper playCompleteMapper) {
         this.videoPostMapper = videoPostMapper;
         this.playRecordMapper = playRecordMapper;
         this.videoRepository = videoRepository;
         this.videoPostTagMapper = videoPostTagMapper;
         this.userInterestBased = userInterestBased;
         this.contentPermission = contentPermission;
+        this.playCompleteMapper = playCompleteMapper;
     }
 
     public VideoUrls getVideoPlayData(String videoId) {
@@ -119,6 +125,7 @@ public class VideoPlayServiceImpl implements VideoPlayService {
         return currentTime != null ? currentTime : 0.0;
     }
 
+    @Transactional(rollbackFor = Exception.class)
     public void saveRecord(MediaProgress mediaProgress) {
         long userId = mediaProgress.getUserId();
         String videoId = mediaProgress.getMediaId();
@@ -135,9 +142,14 @@ public class VideoPlayServiceImpl implements VideoPlayService {
             playRecord.setCreateAt(createAt);
             playRecord.setEnded(ended);
             playRecordMapper.update(playRecord);
-        }
 
-        addUserInterest(userId, videoId);
+            if (ended) {
+                PlayComplete playComplete = new PlayComplete(playRecord);
+                playCompleteMapper.save(playComplete);
+
+                addUserInterest(userId, videoId);
+            }
+        }
     }
 
     private void addUserInterest(long userId, String videoId) {
@@ -152,7 +164,7 @@ public class VideoPlayServiceImpl implements VideoPlayService {
                 return PageScroll.empty();
             }
 
-            nextId = maxId + 1;
+            nextId = maxId;
         }
 
         int total = playRecordMapper.countUserRecord(userId);

+ 32 - 0
content/content-service/src/main/resources/mapper/vod/PlayCompleteMapper.xml

@@ -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="cn.reghao.tnb.content.app.vod.db.mapper.PlayCompleteMapper">
+    <insert id="save" useGeneratedKeys="true" keyProperty="id">
+        insert into vod_play_complete
+        (`user_id`,`video_id`,`create_at`)
+        values 
+        (#{userId},#{videoId},#{createAt})
+    </insert>
+    <insert id="saveAll" useGeneratedKeys="true" keyProperty="id">
+        insert into vod_play_complete
+        (`user_id`,`video_id`,`create_at`)
+        values
+        <foreach collection="list" item="item" index="index" separator=",">
+            (#{item.userId},#{item.videoId},#{item.createAt})
+        </foreach>
+    </insert>
+
+    <select id="findAll" resultType="cn.reghao.tnb.content.app.vod.model.po.PlayComplete">
+        select *
+        from vod_play_complete
+        limit 1000
+    </select>
+    <select id="findByUserIdAndVideoId" resultType="cn.reghao.tnb.content.app.vod.model.po.PlayComplete">
+        select *
+        from vod_play_complete
+        where user_id=#{userId} and video_id=#{videoId}
+        order by id desc
+        limit 1
+    </select>
+</mapper>

+ 2 - 1
content/content-service/src/main/resources/mapper/vod/PlayRecordMapper.xml

@@ -23,6 +23,7 @@
     <select id="findAll" resultType="cn.reghao.tnb.content.app.vod.model.po.PlayRecord">
         select *
         from vod_play_record
+        where ended is true
     </select>
     <select id="findCurrentTime" resultType="java.lang.Double">
         select max(`current_time`)
@@ -47,7 +48,7 @@
         from vod_play_record record
         inner join vod_video_post post
         on record.video_id=post.video_id and record.user_id=#{userId}
-        where record.ended is false and record.create_at &lt; #{nextId}
+        where record.ended is false and record.create_at &lt;= #{nextId}
         order by `create_at` desc
         limit #{pageSize}
     </select>