fix(media): 重转码物理清理旧产物避免唯一键冲突

This commit is contained in:
Zhou Weidong authored and trae-solo-agent committed 2026-10-22 18:21:00 +08:00
1 parent e6b4a747ce
commit e730cfaa7d
2 files changed
+13 -9

No files matched your search

@@ -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<MediaRendition> {
/**
* 物理删除旧产物。唯一索引 uk_rendition(media_asset_id, quality, format) 不含 deleted,
* 逻辑删除的旧行会继续占着唯一键,重转时插入必然冲突,所以这里必须绕过 @TableLogic 真删。
*/
@Delete("<script>DELETE FROM media_rendition WHERE media_asset_id = #{mediaAssetId}"
+ "<if test='episodeId != null and episodeId > 0'> OR episode_id = #{episodeId}</if>"
+ "</script>")
int deletePhysically(@Param("mediaAssetId") Long mediaAssetId, @Param("episodeId") Long episodeId);
}
@@ -217,15 +217,8 @@ public class TranscodeService {
public void succeed(Long taskId, List<MediaRendition> renditions,
MediaThumbnail thumbnail) {
TranscodeTask task = getExisting(taskId);
var renditionDelete = Wrappers.<MediaRendition>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());