feat: #1776 素材库 asset_count 自动同步维护 #1787

Merged
auto-approve-bot merged 2 commits from feature/asset-count-sync-1776 into develop 2026-09-08 10:30:21 +08:00
Owner

Issue #1776: 素材上传后 asset_libraries.asset_count 同步维护

改动概要

核心方案:在 asset_repository 层自动维护计数,同一事务内原子更新

  • asset_repository.create() → 自动 asset_count + 1total_size + file_size
  • asset_repository.delete() → 硬删除时自动 asset_count - 1(已 deleted 的不重复扣减)
  • asset_repository.batch_delete() → 软删除时按库分组批量扣减,只减非 deleted 的
  • 计数下限 0,不会出现负数
  • 使用 CASE WHEN 兼容 SQLite(测试)和 PostgreSQL(生产)

接口层改动:

  • increment_asset_count / decrement_asset_count 从 async 改为 sync(修复 bug:实际用的同步 session)
  • 新增 recount_assets(library_id) 方法:查询实际数量并修正

管理脚本:

  • scripts/recount_asset_counts.py:支持 --dry-run 输出差异清单,确认后执行修正

测试覆盖(13 个新测试):

  • 创建素材计数 +1
  • 多个素材累加计数
  • 硬删除计数 -1
  • 已删除素材再硬删除不重复扣
  • 批量软删除计数 -N
  • 批量删除已删除素材不重复扣
  • 计数不低于 0
  • prepare→complete 幂等不重复计数
  • complete 重试不重复计数
  • recount 修正漂移计数
  • recount 排除 deleted 素材
  • 递增原子性
  • 递减下限保护
## Issue #1776: 素材上传后 asset_libraries.asset_count 同步维护 ### 改动概要 **核心方案:在 asset_repository 层自动维护计数,同一事务内原子更新** - `asset_repository.create()` → 自动 `asset_count + 1`,`total_size + file_size` - `asset_repository.delete()` → 硬删除时自动 `asset_count - 1`(已 deleted 的不重复扣减) - `asset_repository.batch_delete()` → 软删除时按库分组批量扣减,只减非 deleted 的 - 计数下限 0,不会出现负数 - 使用 `CASE WHEN` 兼容 SQLite(测试)和 PostgreSQL(生产) **接口层改动:** - `increment_asset_count` / `decrement_asset_count` 从 async 改为 sync(修复 bug:实际用的同步 session) - 新增 `recount_assets(library_id)` 方法:查询实际数量并修正 **管理脚本:** - `scripts/recount_asset_counts.py`:支持 `--dry-run` 输出差异清单,确认后执行修正 **测试覆盖(13 个新测试):** - ✅ 创建素材计数 +1 - ✅ 多个素材累加计数 - ✅ 硬删除计数 -1 - ✅ 已删除素材再硬删除不重复扣 - ✅ 批量软删除计数 -N - ✅ 批量删除已删除素材不重复扣 - ✅ 计数不低于 0 - ✅ prepare→complete 幂等不重复计数 - ✅ complete 重试不重复计数 - ✅ recount 修正漂移计数 - ✅ recount 排除 deleted 素材 - ✅ 递增原子性 - ✅ 递减下限保护
xiaoxia added 1 commit 2026-09-08 10:05:44 +08:00
feat: #1776 素材库 asset_count 自动同步维护
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 7s
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 21s
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 27s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m40s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m1s
AI Code Review / AI Code Review (pull_request) Successful in 6m19s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 13m21s
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Failing after 14m8s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Unit Tests (pull_request) Successful in 1m33s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 2m33s
CI/CD Pipeline / Validate - Style (pull_request) Failing after 2m35s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m12s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 13m52s
CI/CD Pipeline / Validate - Security (pull_request) Has been cancelled
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
775d1a6cff
- asset_repository.create() 自动递增素材库计数(同事务内原子更新)
- asset_repository.delete() 自动递减计数(硬删除场景)
- asset_repository.batch_delete() 按库分组批量递减计数(软删除场景)
- 计数下限为0,防止出现负数
- 使用 CASE WHEN 兼容 SQLite(测试)和 PostgreSQL(生产)
- increment/decrement_asset_count 改为同步方法,支持自定义 count_delta 和 size_delta
- 新增 recount_assets() 方法用于重算修正
- 新增 scripts/recount_asset_counts.py 管理脚本(支持 dry-run 模式)
- 新增 13 个单元测试覆盖:创建/删除/批量/幂等/重试/recount/并发场景
- 更新 InMemory 仓储和端口接口签名保持同步

🚀 预览环境已部署

项目 详情
PR号 #1787
预览链接 https://pr-1787.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1787 | | 预览链接 | [https://pr-1787.preview.xiaoxiajianji.com](https://pr-1787.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia added 1 commit 2026-09-08 10:24:32 +08:00
style: fix isort import ordering in asset_library_repository
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 2s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (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 / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 40s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 1m6s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m49s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m53s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 1m56s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 2m0s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 2m21s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m17s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 5m6s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 1s
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 2m27s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 7s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 35s
AI Code Review / AI Code Review (pull_request) Successful in 6m22s
6062600fb8
auto-approve-bot merged commit 5678779232 into develop 2026-09-08 10:30:21 +08:00
auto-approve-bot deleted branch feature/asset-count-sync-1776 2026-09-08 10:30:21 +08:00

🗑️ 预览环境已清理

PR #1787 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #1787 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.