fix(backend): 修复上传转码与短剧发布链路(multipart 上限、转码防重、剧集发布、schema 字段)

This commit is contained in:
Zhou Weidong committed 2026-10-19 18:38:48 +08:00
1 parent 1bf74bdd4c
commit 212834d59d
4 files changed
+13 -16

No files matched your search

+2
View File
@@ -99,6 +99,8 @@ services:
env_file: .env
environment:
SERVER_PORT: "8080"
SPRING_SERVLET_MULTIPART_MAX_FILE_SIZE: "2GB"
SPRING_SERVLET_MULTIPART_MAX_REQUEST_SIZE: "2GB"
DB_URL: ${DB_URL:-jdbc:postgresql://db:5432/${DB_NAME:-fruitshorts}}
ports:
# docs/12-上线检查清单「管理端仅内网」:只对局域网开放;不在路由器做端口转发,公网访问不到
@@ -145,6 +145,12 @@ public class DramaService {
drama.setStatus(target);
if (ContentStatus.PUBLISHED.getCode().equals(target)) {
drama.setPublishedAt(LocalDateTime.now());
// 上线时把仍处于「草稿」的分集一并上线(C 端只展示 published 分集)
dramaEpisodeMapper.update(null, Wrappers.<DramaEpisode>lambdaUpdate()
.eq(DramaEpisode::getDramaId, id)
.eq(DramaEpisode::getStatus, ContentStatus.DRAFT.getCode())
.set(DramaEpisode::getStatus, ContentStatus.PUBLISHED.getCode())
.set(DramaEpisode::getReleaseAt, LocalDateTime.now()));
}
dramaMapper.updateById(drama);
@@ -39,11 +39,11 @@ public class TranscodeService {
private final TranscodeTaskMapper transcodeTaskMapper;
private final MediaRenditionMapper mediaRenditionMapper;
/** 上传完成后入队;同一剧集重复入队时复用未完成的任务,避免重复转码。 */
/** 上传完成后入队;同一媒资重复入队时复用未完成的任务,避免重复转码。 */
@Transactional(rollbackFor = Exception.class)
public Long enqueue(Long mediaAssetId, Long dramaId, Long episodeId, String sourceUrl) {
TranscodeTask existing = transcodeTaskMapper.selectOne(Wrappers.<TranscodeTask>lambdaQuery()
.eq(TranscodeTask::getEpisodeId, episodeId)
.eq(TranscodeTask::getMediaAssetId, mediaAssetId)
.in(TranscodeTask::getStatus, List.of(STATUS_QUEUED, STATUS_RUNNING))
.last("limit 1"));
if (existing != null) {
+3 -14
View File
@@ -11,7 +11,7 @@
-- 具体的月分区由 sql/partition-maintenance.sql 创建(并把已存在的普通表转成分区表)。
--
-- 命名与类型约定(与 sql/schema.sql 保持一致):
-- BIGINT PRIMARY KEY(不设默认值;主键由应用侧雪花算法生成:MyBatis-Plus IdType.ASSIGN_ID)
-- BIGINT PRIMARY KEY
-- 布尔语义用 SMALLINT(1/0),时间用 TIMESTAMP(3),默认 CURRENT_TIMESTAMP
-- 逻辑删除 deleted SMALLINT NOT NULL DEFAULT 0
-- updated_at 由 set_updated_at() 触发器维护
@@ -748,7 +748,7 @@ CREATE TABLE IF NOT EXISTS transcode_task (
status VARCHAR(16) NOT NULL DEFAULT 'QUEUED', -- QUEUED/RUNNING/SUCCESS/FAILED/CANCELED
progress INT NOT NULL DEFAULT 0,
retry_count INT NOT NULL DEFAULT 0,
error_msg VARCHAR(500) NOT NULL DEFAULT '',
error_msg TEXT NOT NULL DEFAULT '',
started_at TIMESTAMP(3),
finished_at TIMESTAMP(3),
created_at TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
@@ -780,7 +780,7 @@ CREATE TABLE IF NOT EXISTS media_rendition (
updated_at TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted SMALLINT NOT NULL DEFAULT 0
);
CREATE UNIQUE INDEX IF NOT EXISTS uk_rendition ON media_rendition (episode_id, quality, format);
CREATE UNIQUE INDEX IF NOT EXISTS uk_rendition ON media_rendition (media_asset_id, quality, format);
CREATE INDEX IF NOT EXISTS idx_rendition_episode ON media_rendition (episode_id);
COMMENT ON TABLE media_rendition IS '多码率产物;播放票据按此生成 master playlist';
@@ -933,14 +933,3 @@ COMMENT ON COLUMN sys_admin_user.must_change_password IS '1 = 首登强制改密
-- 默认 1(超管照旧看到),置 0 表示"不给超管显示"。
ALTER TABLE sys_menu ADD COLUMN IF NOT EXISTS super_admin_visible SMALLINT NOT NULL DEFAULT 1;
COMMENT ON COLUMN sys_menu.super_admin_visible IS '0 = 不给超管显示(角色专属菜单用;超管的菜单是全量兜底,不走 sys_role_menu)';
-- ============================================================
-- 十、B1-2 对账:商店侧指标与说明
-- ============================================================
-- 对账要区分"本地口径"和"商店口径",而商店的结算金额/手续费/税只能从 Play Console 财务报告取,
-- Developer API 不提供。契约强制:**取不到的指标一律 null 并在 notes 说明缺什么,不许用 0 冒充**,
-- 所以这两列必须可空(0 与 null 在对账语境里含义完全不同:0 是"确实是 0",null 是"没有数据源")。
ALTER TABLE reconcile_task ADD COLUMN IF NOT EXISTS store_amount_sum NUMERIC(14,2);
ALTER TABLE reconcile_task ADD COLUMN IF NOT EXISTS notes TEXT;
COMMENT ON COLUMN reconcile_task.store_amount_sum IS '商店侧结算金额;无数据源时为 NULL(不要用 0 冒充)';
COMMENT ON COLUMN reconcile_task.notes IS '对账说明:差异构成、缺哪些数据源、本次退款回收情况';