From e730cfaa7d5020fcf60e43924ed75c42b634d16d Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Thu, 22 Oct 2026 18:21:00 +0800 Subject: [PATCH] =?UTF-8?q?fix(media):=20=E9=87=8D=E8=BD=AC=E7=A0=81?= =?UTF-8?q?=E7=89=A9=E7=90=86=E6=B8=85=E7=90=86=E6=97=A7=E4=BA=A7=E7=89=A9?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E5=94=AF=E4=B8=80=E9=94=AE=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../media/dal/mapper/MediaRenditionMapper.java | 11 +++++++++++ .../fruitshorts/media/service/TranscodeService.java | 11 ++--------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/fruitshorts-module-media/src/main/java/com/fruitshorts/media/dal/mapper/MediaRenditionMapper.java b/fruitshorts-module-media/src/main/java/com/fruitshorts/media/dal/mapper/MediaRenditionMapper.java index 92e7eab..4d2150c 100644 --- a/fruitshorts-module-media/src/main/java/com/fruitshorts/media/dal/mapper/MediaRenditionMapper.java +++ b/fruitshorts-module-media/src/main/java/com/fruitshorts/media/dal/mapper/MediaRenditionMapper.java @@ -4,6 +4,17 @@ package com.fruitshorts.media.dal.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.fruitshorts.media.dal.entity.MediaRendition; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Param; public interface MediaRenditionMapper extends BaseMapper { + + /** + * 物理删除旧产物。唯一索引 uk_rendition(media_asset_id, quality, format) 不含 deleted, + * 逻辑删除的旧行会继续占着唯一键,重转时插入必然冲突,所以这里必须绕过 @TableLogic 真删。 + */ + @Delete("") + int deletePhysically(@Param("mediaAssetId") Long mediaAssetId, @Param("episodeId") Long episodeId); } diff --git a/fruitshorts-module-media/src/main/java/com/fruitshorts/media/service/TranscodeService.java b/fruitshorts-module-media/src/main/java/com/fruitshorts/media/service/TranscodeService.java index 1dac43c..defaf62 100644 --- a/fruitshorts-module-media/src/main/java/com/fruitshorts/media/service/TranscodeService.java +++ b/fruitshorts-module-media/src/main/java/com/fruitshorts/media/service/TranscodeService.java @@ -217,15 +217,8 @@ public class TranscodeService { public void succeed(Long taskId, List renditions, MediaThumbnail thumbnail) { TranscodeTask task = getExisting(taskId); - var renditionDelete = Wrappers.lambdaQuery(); - if (task.getEpisodeId() != null && task.getEpisodeId() > 0) { - renditionDelete.and(wrapper -> wrapper - .eq(MediaRendition::getMediaAssetId, task.getMediaAssetId()) - .or().eq(MediaRendition::getEpisodeId, task.getEpisodeId())); - } else { - renditionDelete.eq(MediaRendition::getMediaAssetId, task.getMediaAssetId()); - } - mediaRenditionMapper.delete(renditionDelete); + // 唯一索引不含 deleted,旧产物必须物理删除,否则重转时插入会撞 uk_rendition + mediaRenditionMapper.deletePhysically(task.getMediaAssetId(), task.getEpisodeId()); for (MediaRendition rendition : renditions) { rendition.setMediaAssetId(task.getMediaAssetId()); rendition.setDramaId(task.getDramaId());