feat(assets): 素材余量角标 + Step2 过滤已用尽素材 #1548
Reference in New Issue
Block a user
Delete Branch "feat/asset-usage-badge-filter"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
背景
后端正在上线片段重复率控制机制(任意两条成片画面重复率 ≤15%、单区间复用上限 3 次)。素材被反复切到彻底用尽后,不应再出现在生成流程的可选列表里。设计原则:素材库是管理视角,余量状态在素材库看;Step2 是选用视角,不能用的素材不显示、选不到。
改动
1. 素材库卡片余量角标(AssetCard)
视频素材卡片 meta 区(StatusPill/时长同一行)增加余量角标:
usable === false:红色实心「已用尽」used_ratio >= 0.85:红色软底「即将用尽」used_ratio >= 0.5:橙色软底「已用 xx%」< 0.5或字段缺失:不显示2. Step2 手动模式过滤
usable === false,已用尽素材不出现、无法勾选3. Step2 智能匹配兜底过滤
4. 降级与约束
isAssetUsable(api/assets/usage.ts)+ 角标计算getUsageBadge(pages/assets/types.ts)验收
🚀 预览环境已部署
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
无
💡 改进建议(不阻塞合并)
[apps/web/src/pages/generate/hooks/step2-materials/useSmartMatch.ts: 36] 智能匹配错误提示可能不够精确
useStep2Materials.ts中,useSmartMatch接收的materials参数已经被过滤为selectableMaterials(仅包含可用素材)。因此,在handleSmartMatch函数中,当usableItems.length === 0时,materials.items.length必然也为 0。这意味着三元运算符中的"素材可能已用尽,请先上传新素材"这条提示语在当前调用链下是死代码,永远不会触发。用户只会看到“当前视频库暂无素材”。materials(包含已用尽素材)传递给useSmartMatch,并在 Hook 内部进行过滤;或者接受当前行为,删除不可达的分支代码以简化逻辑。[apps/web/src/pages/generate/hooks/step2-materials/useMaterialLibrary.ts: 38]
selectableMaterials的total字段语义可能存在偏差selectableMaterials是通过过滤materials.items得到的,但其total字段直接沿用了materials.total(即素材库的原始总数)。如果 UI 组件(如ManualMaterialList)使用total来显示“共 X 条”或用于判断分页结束(例如items.length < total),则会出现数据不一致(显示总数很大,但列表为空)或分页逻辑判断错误(误以为还有下一页)的情况。total字段。如果用于展示“可选素材总数”,建议计算过滤后的实际总数;如果用于分页加载控制,需确保前端过滤不会干扰“加载更多”的触发条件。✅ 良好实践
isAssetUsable函数通过asset.usable !== false的判断,优雅地处理了后端字段未上线时的降级逻辑,保证了新旧代码的平滑过渡。AssetUsageLike接口和UsageBadge类型定义清晰,单元测试覆盖了边界情况(如null、undefined、阈值判断),增强了代码健壮性。useSmartMatch中,即使后端 API 返回了包含已用尽素材的数据,前端也进行了二次过滤(filter(isAssetUsable)),防止了无效数据进入选片流程。🤖 由 AI 代码审查机器人自动生成 | 2026-08-29 17:21:49 | 模型:
CI全绿,自动审批通过。
CI全绿,自动审批通过。
🗑️ 预览环境已清理
PR #1548 已关闭或合并,对应的预览环境已被清理。