fix: 素材回退逻辑支持模糊匹配二级分类

- 新增 broll_category.get_by_name_like_and_level() 模糊匹配方法
- _try_fallback_to_parent 增加三级降级策略:
  1. 精确匹配
  2. 模糊匹配 LIKE %parent_name%(兼容'电路施工'→'电路施工镜')
  3. 自动补后缀'镜'/'阶段'再精确匹配
- 解决 scene 中 parent_name 与数据库二级分类 name 不一致导致回退失败的问题
This commit is contained in:
小鱼开发
2026-06-02 15:51:43 +08:00
parent af8c483910
commit 3587559a87
2 changed files with 37 additions and 0 deletions
+13
View File
@@ -57,6 +57,19 @@ class BrollCategoryCRUD(CRUDBase[BrollCategory]):
)
return list(result.scalars().all())
async def get_by_name_like_and_level(
self, db: AsyncSession, *, name: str, level: int
) -> BrollCategory | None:
"""根据名称模糊匹配和层级获取启用的分类(LIKE %name%"""
result = await db.execute(
select(BrollCategory).where(
BrollCategory.name.like(f"%{name}%"),
BrollCategory.level == level,
BrollCategory.status == "active",
)
)
return result.scalar_one_or_none()
# 导出实例
broll_category = BrollCategoryCRUD()
@@ -69,6 +69,11 @@ async def _try_fallback_to_parent(
- 若 scene 含 '-',取后半部分作为 parent_name(如 '电路施工-电路施工' -> '电路施工'
- 若不含 '-',直接以整个 scene 作为 parent_name
匹配策略(逐级降级):
1. 精确匹配 level=2 分类 name
2. 模糊匹配(LIKE %parent_name%),兼容 "电路施工""电路施工镜"
3. 去掉常见后缀(镜、阶段等)再精确匹配
返回:
随机选中的一个 level=3 子分类,或 None
"""
@@ -77,9 +82,28 @@ async def _try_fallback_to_parent(
else:
parent_name = normalized_scene
# 1. 精确匹配
parent = await broll_category.get_by_name_and_level(
db, name=parent_name, level=2
)
# 2. 模糊匹配(兼容 "电路施工" → "电路施工镜"
if parent is None:
parent = await broll_category.get_by_name_like_and_level(
db, name=parent_name, level=2
)
# 3. 去掉常见后缀再试
if parent is None:
for suffix in ("", "阶段"):
if not parent_name.endswith(suffix):
candidate = parent_name + suffix
parent = await broll_category.get_by_name_and_level(
db, name=candidate, level=2
)
if parent:
break
if parent is None:
return None