fix(asset): AssetStatus枚举兼容历史uploaded值,避免500 #227

Merged
xiaoxia merged 3 commits from fix/asset-status-enum-compat into develop 2026-07-12 11:49:41 +08:00
Owner

问题

健康检查发现生产环境有26个 classification_status = "done" 枚举转换失败的500错误,同类问题 AssetStatus 也存在:数据库里有 uploaded 历史值,但Python枚举只定义了 uploading/ready/processing/error,直接 AssetStatus("uploaded") 会抛异常导致500。

修复方案

AssetStatus 枚举新增 _missing_ 方法,做历史值兼容:

历史值 映射到 说明
uploaded/success/ok/done/complete READY 早期版本用uploaded表示上传完成
upload/uploading_start/upload_start UPLOADING 上传中状态的不同写法
failed/fail/err ERROR 失败状态的不同写法
process/running/run PROCESSING 处理中状态的不同写法
其他未知值 READY 兜底,不阻塞业务

影响范围

  • packages/domain/entities.py:AssetStatus枚举加_missing_方法
  • 所有调用 AssetStatus(model.status) 的地方自动生效,无需改调用点
  • 与ClassificationStatus修复方案一致,统一了枚举兼容模式

测试

新增 tests/unit/test_asset_status_enum.py,27个测试用例,覆盖:

  • 4个正常值
  • 15个历史脏数据映射(含大小写、空格)
  • 5个兜底场景(未知值/空串/None/int)
  • 字符串值序列化不变
## 问题 健康检查发现生产环境有26个 `classification_status = "done"` 枚举转换失败的500错误,同类问题 `AssetStatus` 也存在:数据库里有 `uploaded` 历史值,但Python枚举只定义了 `uploading/ready/processing/error`,直接 `AssetStatus("uploaded")` 会抛异常导致500。 ## 修复方案 给 `AssetStatus` 枚举新增 `_missing_` 方法,做历史值兼容: | 历史值 | 映射到 | 说明 | |--------|--------|------| | uploaded/success/ok/done/complete | READY | 早期版本用uploaded表示上传完成 | | upload/uploading_start/upload_start | UPLOADING | 上传中状态的不同写法 | | failed/fail/err | ERROR | 失败状态的不同写法 | | process/running/run | PROCESSING | 处理中状态的不同写法 | | 其他未知值 | READY | 兜底,不阻塞业务 | ## 影响范围 - `packages/domain/entities.py`:AssetStatus枚举加`_missing_`方法 - 所有调用 `AssetStatus(model.status)` 的地方自动生效,无需改调用点 - 与ClassificationStatus修复方案一致,统一了枚举兼容模式 ## 测试 新增 `tests/unit/test_asset_status_enum.py`,27个测试用例,覆盖: - ✅ 4个正常值 - ✅ 15个历史脏数据映射(含大小写、空格) - ✅ 5个兜底场景(未知值/空串/None/int) - ✅ 字符串值序列化不变
Author
Owner

审查结论: 通过(可合并)

审查范围

  • packages/domain/entities.py:AssetStatus 新增 _missing_ 兼容方法
  • tests/unit/test_asset_status_enum.py:27 个测试用例

P0/P1 问题

无。

核心确认点

  1. 方案一致:与 ClassificationStatus 修复方案完全一致(_missing_ + strip().lower() 归一化 + READY 兜底),枚举兼容模式统一
  2. 映射逻辑正确
    • uploaded/success/ok/done/complete → READY(生产已确认 uploaded 是历史值)
    • upload/uploading_start/upload_start → UPLOADING
    • failed/fail/err → ERROR
    • process/running/run → PROCESSING
    • 未知值/非字符串 → READY(兜底不阻塞)
  3. 无安全漏洞:纯枚举值兼容转换,不涉及鉴权、越权、数据泄露风险
  4. 不破坏现有逻辑_missing_ 仅在正常值匹配失败时触发,已有逻辑完全不受影响
  5. 测试充分:27 个用例覆盖正常值/历史脏数据/大小写/空格/空串/None/int/序列化,本地全绿

P2(不阻塞合并)

  • entities.py 文件权限从 644 变 755,没必要改,顺手的话可以改回来

P3

  • processing 出现在历史值映射列表里是冗余的(它本身就是正常值,永远走不到 missing),不影响功能
## 审查结论:✅ 通过(可合并) ### 审查范围 - `packages/domain/entities.py`:AssetStatus 新增 `_missing_` 兼容方法 - `tests/unit/test_asset_status_enum.py`:27 个测试用例 ### P0/P1 问题 无。 ### 核心确认点 1. **方案一致**:与 ClassificationStatus 修复方案完全一致(`_missing_` + strip().lower() 归一化 + READY 兜底),枚举兼容模式统一 ✅ 2. **映射逻辑正确**: - uploaded/success/ok/done/complete → READY(生产已确认 uploaded 是历史值) - upload/uploading_start/upload_start → UPLOADING - failed/fail/err → ERROR - process/running/run → PROCESSING - 未知值/非字符串 → READY(兜底不阻塞) 3. **无安全漏洞**:纯枚举值兼容转换,不涉及鉴权、越权、数据泄露风险 4. **不破坏现有逻辑**:`_missing_` 仅在正常值匹配失败时触发,已有逻辑完全不受影响 5. **测试充分**:27 个用例覆盖正常值/历史脏数据/大小写/空格/空串/None/int/序列化,本地全绿 ✅ ### P2(不阻塞合并) - `entities.py` 文件权限从 644 变 755,没必要改,顺手的话可以改回来 ### P3 - `processing` 出现在历史值映射列表里是冗余的(它本身就是正常值,永远走不到 _missing_),不影响功能
xiaoxia force-pushed fix/asset-status-enum-compat from 7c2e330faf to 33b588ff96 2026-07-12 11:03:58 +08:00 Compare
xiaoxia added 3 commits 2026-07-12 11:16:30 +08:00
- 新增_missing_方法处理历史脏数据
- uploaded/success/ok/done → READY
- upload/upload_start → UPLOADING
- failed/fail/err → ERROR
- process/running/run → PROCESSING
- 未知值兜底为READY,不阻塞业务
- 新增27个单元测试覆盖全部场景
fix(test): AssetStatus测试用ERROR而非FAILED
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m13s
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Successful in 2m41s
CI/CD Pipeline / Build & Push Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Build Production Runtime Images (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m32s
2a2de99ea1
xiaoxia force-pushed fix/asset-status-enum-compat from e30866518b to 2a2de99ea1 2026-07-12 11:16:30 +08:00 Compare
xiaoxia merged commit 8883581e34 into develop 2026-07-12 11:49:41 +08:00
Sign in to join this conversation.