Files
suixinkan_uikit/suixinkan/Features/TravelAlbum/AI修图需求.md
T

9.7 KiB

AI 修图需求文档

本文档描述旅拍相册中 AI 修图的产品需求和业务规则。后端接口建议见同目录《AI 修图接口文档》。

1. 目标与范围

  • 相册管理页面展示用户已在其他流程上传到 OSS、并已在后端登记的图片素材。
  • 用户可从网格页批量发起 AI 修图,也可从单图预览页首次修图或重新修图。
  • 精修图和氛围感图是某张原图的“关联图”;封面图是相册内的独立素材,不归属于任何一张原图。
  • AI 生成为异步长流程,页面必须能分辨已提交、排队、处理、成功和失败。

2. 核心概念

2.1 原图项目

一张原图与它的精修图、氛围感图共同组成一个原图项目。原图的素材 ID 是项目的稳定标识,OSS URL 不作为业务标识。

2.2 关联图

  • refined:精修图,一张原图最多保留一个当前有效版本。
  • atmosphere:氛围感图,一张原图最多保留一个当前有效版本。
  • 关联图不作为独立 Cell 出现在相册网格中,只在该原图的预览页 Tab 中展示。

2.3 封面图

  • 一次选择不少于 4 张原图时,必须选择封面模板。
  • 封面模板使用本次选中的多张原图生成封面图。
  • 封面图不关联某张原图,生成成功后作为 cover 类型的独立素材出现在相册网格中。
  • 删除参与生成封面的原图时,不级联删除已生成的独立封面图。

3. 相册管理页

3.1 网格列表

  • 网格展示原图和独立封面图,不直接展示精修图、氛围感图。
  • 列表需支持稳定分页。AI 任务执行期间可能插入新的封面素材,不应造成重复或漏项。
  • 点击原图 Cell 进入图片预览页,可横向滑动切换其他原图项目。

3.2 Cell 修图状态

Cell 左上角展示稳定的修图状态:

状态 含义
已上传 原图已登记,从未提交 AI 修图,当前也没有任务
待处理 AI 任务已提交,正在排队
修图中 AI 任务已开始执行
AI 已修 最新任务已成功,存在有效 AI 结果
失败 最新任务执行失败,可能仍保留上一版成功结果

状态以后端返回的枚举代码为准,客户端自行映射中文文案,不依赖可变的中文状态名。

3.3 批量 AI 修图

  1. 用户进入多选模式并选择一张或多张原图。
  2. 点击底部“AI 修图”,弹出模板选择页。
  3. 精修模板必选且单选。
  4. 氛围感模板可选且单选,已选时可取消。
  5. 选中原图数量小于 4 时不展示封面模板。
  6. 选中原图数量大于等于 4 时展示封面模板,且必须单选一个。
  7. 提交后,每张原图分别生成精修图,选了氛围感模板时再分别生成氛围感图。
  8. 选了封面模板时,整个批次额外生成独立封面图。
  9. 提交成功指后端已受理任务,不代表图片已生成。

3.4 修图额度

  • 模板选择弹窗的底部固定显示当前用户可用的 AI 修图剩余额度,文案例如“剩余 12 次”,不随模板列表滚动消失。
  • 精修和氛围感生成会消耗修图额度;封面模板生成不消耗任何修图额度。
  • 本需求默认按生成结果张数计费:每张原图的精修结果消耗 1 次,每张原图的氛围感结果消耗 1 次,封面结果消耗 0 次。最终单价由后端返回,客户端不硬编码。
  • 重新修图与首次修图使用相同的额度规则。
  • 后端受理任务时预占本次所需额度,避免用户并发提交造成超额。
  • 只对最终生成成功的精修/氛围感结果扣减额度;失败或取消的子任务释放对应预占额度。
  • 如剩余可用额度不足,提交按钮禁用并显示明确提示;后端提交接口仍必须做最终校验。

3.5 批量删除

  • 用户多选原图后点击“删除”,删除选中原图及各自的精修图、氛围感图,并取消关联的未完成任务。已有任务记录保留用于审计和排查,但不再对客户端展示已删除素材。
  • 已生成的独立封面图不在级联删除范围内,除非用户明确选中该封面素材本身。
  • 批量删除应只调用一次后端接口,后端应返回整体或逐项结果,不由客户端循环调用单删接口。

4. 图片预览页

4.1 横向切换

  • 从网格点击某张原图进入预览页。
  • 横向滑动在相册内的不同原图项目之间切换。
  • 切换到新的原图项目时,默认显示其“原图”。

4.2 底部操作

页面底部固定显示三个按钮:

  • AI 修图
  • 删除
  • 刷新

4.3 关联图 Tab

  • 如果当前原图没有任何已生成的关联图,不显示 Tab;首次生成任务排队或处理期间仍不显示。
  • 存在至少一张已成功的关联图时显示 Tab。
  • Tab 最多包含“原图”、“精修后”、“氛围感”;关联图 Tab 只在对应图片已生成时显示。
  • 点击 Tab 切换当前原图项目内的展示图片,不切换原图项目。
  • 某个已有结果的 Tab 重新提交修图后,仍可展示上一版图片,同时通过该结果槽位的任务状态展示“待处理/修图中/失败”。
  • 首次生成尚无图片 URL 时,通过原图 Cell 状态和项目任务状态表达进度,不创建空 Tab。

4.4 预览页删除

  • 删除的对象始终是当前原图项目,而不是当前 Tab 上的单张关联图。
  • 删除原图及其所有关联图,并取消关联的未完成任务;历史任务记录保留用于审计。
  • 删除成功后显示下一个原图项目;如果删除的是末项,则回退上一项;无剩余项时关闭预览页。

4.5 预览页 AI 修图

当前情况 模板要求 生成与覆盖规则
不显示 Tab 精修必选,氛围感可选 首次生成关联的精修图,可选生成氛围感图
已显示 Tab,当前为“原图” 精修、氛围感均可选,至少选择一种 只重新生成本次选中的结果类型;新结果成功后替换对应旧结果,未选类型保持不变
已显示 Tab,当前为“精修后” 精修、氛围感均可选,至少选择一种 只重新生成本次选中的结果类型;新结果成功后替换对应旧结果,未选类型保持不变
已显示 Tab,当前为“氛围感” 精修、氛围感均可选,至少选择一种 只重新生成本次选中的结果类型;新结果成功后替换对应旧结果,未选类型保持不变

重新修图期间应保留上一版成功图片可见;只有新结果成功时才原子替换当前版本。失败时继续保留旧版本,并返回可展示的错误信息。

4.6 刷新

  • 点击“刷新”只获取当前显示原图项目的最新数据,包括原图、关联图、各结果槽位的任务状态和整体修图状态。
  • 不应为刷新一张图重新拉取整个分页列表。
  • 服务端对已替换的图片应返回新的资源版本或新 URL,避免 CDN/客户端缓存继续显示旧图。

5. 异步任务规则

  • 每次提交返回唯一 job_id、服务端接收时间和当前状态。
  • 每次提交同时返回额度预占数、提交前剩余额度和预占后可用额度。
  • 任务状态至少包含:queued、processing、succeeded、partially_succeeded、failed、canceled。
  • 精修、氛围感和封面子任务可以独立成功或失败,服务端需保留逐原图、逐结果类型的状态。
  • 客户端重试同一次提交时不得创建重复任务,由幂等键保证。
  • 同一原图、同一结果类型存在未完成任务时,服务端拒绝再次提交,避免旧任务晚完成后覆盖新结果。

6. 删除与数据一致性

  • 删除原图项目需在一个后端业务操作中完成:标记原图删除、标记关联图删除、取消未完成任务。
  • 数据库状态成功后再异步清理 OSS 文件,不应因 OSS 删除失败导致客户端删除失败。
  • AI 回调必须检查任务和素材是否已删除或已被新版本替代,过期回调不得恢复已删除素材或覆盖新结果。

7. 异常与提示

  • 模板加载失败:保留页面并允许重试。
  • 模板已下线:提交时返回明确错误码,客户端刷新模板列表。
  • 素材不存在、不属于当前相册或不是原图:整次提交不受理,并返回问题素材 ID。
  • 数量不满足封面规则:返回稳定错误码和最小数量。
  • 任务部分成功:保留已成功结果,失败槽位提供错误码、错误信息和是否可重试。
  • 网络超时:客户端使用原幂等键重试,不可产生两个任务。

8. 权限与校验

  • 后端必须从登录态校验用户对相册、原图和模板的访问权,不信任客户端传入的用户 ID、景区 ID 或批次 ID。
  • 模板是否适用于相册所属景区,由后端根据相册 ID 推导和校验。
  • 后端负责校验精修、氛围感和封面模板的必选/可选规则,客户端校验只用于交互提示。

9. 默认产品决策

为使接口和异步覆盖行为可实现,本文档采用以下默认决策:

  1. 重新修图不先删旧图;新图成功后才原子切换,失败仍保留旧图。
  2. 在“原图” Tab 重新修图时,若用户未选氛围感模板,保留现有氛围感图,只替换精修图。
  3. 封面图只在生成成功后插入网格;生成前由所选原图的修图状态和任务详情表达进度。
  4. 每个关联图类型只对外暴露一个当前有效版本;历史版本是否长期保留属于后端存储策略,不在当前客户端功能中展示。

第 2 条是对“氛围感模板可选”的安全解释:未选不等于删除旧结果。如产品希望未选时删除旧氛围感图,应增加明确的“移除氛围感”操作,不建议让后端根据字段缺失隐式删除。