**经验总结**:
- `@Async` 方法不能直接使用 `HttpServletRequest` 对象
- 需要在调用异步方法前提取所有需要的数据
- DTO 模式是解决此类问题的标准方案
---
## SfxService 音效文件和标签增删查改逻辑修复
### 2026-03-16 修复 SfxService 内部逻辑问题
#### 问题描述
验证 SfxService 内部音效文件和音效标签的增删查改逻辑,发现以下问题:
#### 问题1: `processWebmTranscode()` 异步返回值无效 (严重)
**问题原因**:
`@Async` 异步方法返回 `boolean` 类型,调用者 `moveToNewPath()` 立即得到默认值 `false`,
导致转码还没开始就被判定失败,然后删除已移动的文件。
**解决方案**:
移除 `@Async` 注解,改为同步执行,确保返回值正确传递。
#### 问题2: `deleteSfxByIds()` 未加载标签
**问题原因**:
`findByIdIn()` 没有 `@EntityGraph`,标签集合未加载,导致标签计数递减逻辑无法正确执行。
**解决方案**:
新增 `findByIdInWithTags()` 方法,使用 `@EntityGraph` 加载标签关联。
#### 问题3: `removeTagFromSfx()` 缺少关联清理
**问题原因**:
移除标签时未显式清理 `SfxTag` 的双向关联引用,与 `updateSfxTags()` 方法不一致。
**解决方案**:
添加 `tagToRemove.setSfx(null)` 和 `tagToRemove.setTag(null)` 确保关联清理一致性。
#### 问题4: `batchUpdate()` 循环内多次 save 效率低下
**问题原因**:
每次添加标签都触发 `save()` 和 `invalidateCache()`,效率低下。
**解决方案**:
新增 `addTagToSfxWithoutSave()` 私有方法,循环结束后统一执行 `save()`。
#### 修改文件
- `src/main/java/com/imdaxiong/bigbearcloud/service/SfxService.java`
- `src/main/java/com/imdaxiong/bigbearcloud/repository/SfxRepository.java`
#### 修复汇总
| 问题 | 修复方案 |
|------|----------|
| `processWebmTranscode()` 异步返回值无效 | 移除 `@Async` 注解 |
| `deleteSfxByIds()` 未加载标签 | 新增 `findByIdInWithTags()` 方法 |
| `removeTagFromSfx()` 缺少关联清理 | 添加 setSfx(null) 和 setTag(null) |
| `batchUpdate()` 循环内多次 save | 新增私有方法,统一 save |
