44 lines
2.9 KiB
Markdown
44 lines
2.9 KiB
Markdown
---
|
||
id: T-586
|
||
title: AI工场数据地基:项目、图片资产、异步任务与终选顺序 SQLite 模型
|
||
phase: 7
|
||
deps: [T-538]
|
||
status: TODO
|
||
created: 2026-07-11
|
||
---
|
||
|
||
## 问题 / 背景
|
||
|
||
⑥ AI工场需要同时管理多个账号/商品、蝦皮原图、迭代生成图、多个在途 cmhub task、主图/详情图终选顺序和重启续查。只靠 `data/images/pool/<slug>/<item_id>/` 文件名无法可靠恢复来源、任务状态和排序,因此采用“SQLite 保存状态事实、目录保存图片字节”。完整产品口径见 Obsidian《图片精修-主图详情图生成方案》和 `docs/ui/tab6-ai-studio-v3.svg`。
|
||
|
||
## 方案
|
||
|
||
- `app/db.py` 增加 ad-hoc 兼容迁移和数据对象:
|
||
- `image_studio_projects`:账号、商品 ID、目标主图数/详情数、草稿提示词、项目状态、软删除/时间字段;同一账号+商品唯一。
|
||
- `image_studio_assets`:项目、类别(原图/生成主图/生成详情图)、远程 URL、本地路径、比例、父资产、生成提示词、可用/缺失状态。
|
||
- `image_studio_jobs`:资产候选、生成来源、task key/id、Provider、类型、状态、错误、重试和时间字段;当前阶段 `provider` 固定为 `cmhub`,字段仅用于状态自描述和后续兼容。
|
||
- `image_studio_selections`:项目、`main/detail`、连续 position、asset;类别+位置唯一,同一资产在同类别唯一。
|
||
- 新增独立 service 模块(命名按实现确定)封装 CRUD、事务排序、路径计算和状态转换,GUI 不直接写 SQL。
|
||
- 图片目录固定在 `data/images/pool/<slug>/<item_id>/{originals,generated,exports}/`,所有路径继续通过 `appconfig` 从 `data/` 解析。
|
||
- 数据写入顺序保证崩溃可恢复:先建 job/key,submit 后立即写 task_id,图片完整落盘后才创建/启用 asset。
|
||
|
||
## 验收要点
|
||
|
||
- 历史 DB 启动可自动补表/索引且不影响既有 tasks/batches/accounts。
|
||
- 同账号+商品重复创建返回已有项目;不同账号可绑定不同商品项目。
|
||
- 资产来源、父资产、比例和本地路径可完整读回;文件缺失可标记但不物理删记录。
|
||
- job 支持 `pending/submitted/running/succeeded/failed` 及 task key/id 生命周期,重启后可列出待续查任务。
|
||
- 终选位置连续、并发写入事务安全、同资产同类别不重复;允许同资产各出现一次 main/detail。
|
||
- 纯逻辑测试覆盖迁移、唯一约束、CRUD、状态转换、排序和路径隔离;运行全量 unittest、ruff、compileall、`git diff --check`。
|
||
|
||
## 边界(不改什么)
|
||
|
||
- 不做 GUI、CDP、网络下载、AI 请求、导出或蝦皮写操作。
|
||
- 不实现自定义 Provider、API Key 或生成来源切换。
|
||
- 不把图片 BLOB 写 SQLite,不采用目录扫描猜状态。
|
||
- 不提供本地图片导入,不物理删除项目历史。
|
||
|
||
## 执行记录
|
||
|
||
(完成后记录实现文件、迁移决策与验证结果。)
|