From 212834d59d9c81ff09e775b0a4e60365801446f6 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 19 Oct 2026 18:38:48 +0800 Subject: [PATCH] =?UTF-8?q?fix(backend):=20=E4=BF=AE=E5=A4=8D=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E8=BD=AC=E7=A0=81=E4=B8=8E=E7=9F=AD=E5=89=A7=E5=8F=91?= =?UTF-8?q?=E5=B8=83=E9=93=BE=E8=B7=AF=EF=BC=88multipart=20=E4=B8=8A?= =?UTF-8?q?=E9=99=90=E3=80=81=E8=BD=AC=E7=A0=81=E9=98=B2=E9=87=8D=E3=80=81?= =?UTF-8?q?=E5=89=A7=E9=9B=86=E5=8F=91=E5=B8=83=E3=80=81schema=20=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 2 ++ .../content/service/DramaService.java | 6 ++++++ .../media/service/TranscodeService.java | 4 ++-- sql/schema-phase1.sql | 17 +++-------------- 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index b90e1c8..38a2cff 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -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-上线检查清单「管理端仅内网」:只对局域网开放;不在路由器做端口转发,公网访问不到 diff --git a/fruitshorts-module-content/src/main/java/com/fruitshorts/content/service/DramaService.java b/fruitshorts-module-content/src/main/java/com/fruitshorts/content/service/DramaService.java index f7c1b47..9834021 100644 --- a/fruitshorts-module-content/src/main/java/com/fruitshorts/content/service/DramaService.java +++ b/fruitshorts-module-content/src/main/java/com/fruitshorts/content/service/DramaService.java @@ -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.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); 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 b2282dd..d9f5879 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 @@ -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.lambdaQuery() - .eq(TranscodeTask::getEpisodeId, episodeId) + .eq(TranscodeTask::getMediaAssetId, mediaAssetId) .in(TranscodeTask::getStatus, List.of(STATUS_QUEUED, STATUS_RUNNING)) .last("limit 1")); if (existing != null) { diff --git a/sql/schema-phase1.sql b/sql/schema-phase1.sql index fac5c1b..2af085d 100644 --- a/sql/schema-phase1.sql +++ b/sql/schema-phase1.sql @@ -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 '对账说明:差异构成、缺哪些数据源、本次退款回收情况';