feat: 更新 2.2 文档
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
# V2.2 商品 AI 编辑页
|
||||
|
||||
> 状态:需求与架构设计,尚未开发。本文及同目录文档优先于 `docs/v2.1/` 中关于商品编辑页、试算页和多 SKU 的旧设计。
|
||||
|
||||
## 1. 目标
|
||||
|
||||
V2.2 用一张「商品(SPU)」和多个「可售 SKU」表达一个采集商品,重做当前商品编辑页为 **商品 AI 编辑页**。不在旧 `/trial/:id` 上继续叠加多 SKU 功能;旧试算页在 V2.2 开发完成前保持可用但冻结。
|
||||
|
||||
编辑页需要支持:
|
||||
|
||||
- 维护可扩展的通用属性和 SKU 独立属性;
|
||||
- 为每个 SKU 管理图片、视频与视频封面;
|
||||
- 从包装物流规格发起定价,确认后回填 SKU 售价和划线价;
|
||||
- AI 生成标题、标签、简介等通用内容,以及按 SKU 生成尺寸图和套图;
|
||||
- 为后续「上架至 Ozon」保留一 SKU 一 offer 的稳定发布模型。
|
||||
|
||||
## 2. 已确认决策
|
||||
|
||||
| 主题 | 决策 |
|
||||
|---|---|
|
||||
| Ozon 可售单元 | 一个本地 SKU 对应一个独立 Ozon `offer_id` 和一个 `/v3/product/import.items[]` 项。 |
|
||||
| Ozon 变体 | 类目接口的 `is_aspect=true` 属性(如颜色/尺码)作为 SKU 属性提交;不假定 Ozon 会自动把多个 item 合并为一个前台变体组,发布阶段另行真机验证。 |
|
||||
| 型号和货号 | 型号是父商品的通用属性;同一商品所有 SKU 共用。货号是 SKU 属性,后续可由 AI 生成、用户可编辑。 |
|
||||
| 尺寸图 | 必须逐 SKU 生成,只读取该 SKU 已确认的实物规格快照。 |
|
||||
| 计价 | 不在页面常驻展示试算卡;每个 SKU 的「定价」弹窗使用其有效包装物流规格计算,确认后回填售价与划线价。 |
|
||||
| 图片采集 | 1688、淘宝、天猫当前不能可靠地按 SKU 采集图片。采集主图、详情图作为商品候选素材;已能稳定归属的 SKU 图才绑定 SKU。 |
|
||||
| 单规格商品 | 单规格商品也必须有一条默认 SKU。SKU 不是“有多规格时才存在”的可选结构;它是定价、媒体选择、货号和未来 Ozon offer 的统一可售单元。 |
|
||||
| 字段继承 | “SKU 字段为空”只表示该 SKU 的某一可继承字段未覆盖父商品默认值,绝不表示 SKU 记录、SKU 名称或货号为空,更不表示单规格商品。 |
|
||||
| 动态类目属性 | 先选 Ozon `description_category_id + type_id`,再读取该类目的属性 schema。`is_aspect=true` 默认归入 SKU 变体属性;其他属性默认归入通用属性,但允许业务显式改为 SKU 属性。 |
|
||||
| 编辑页 | 用新的商品 AI 编辑页替代旧商品编辑页;不修改旧试算页来承载多 SKU。 |
|
||||
|
||||
## 3. Ozon 文档依据
|
||||
|
||||
仓内 `docs/ozon-seller-api/04-product-import.md` 表明,`/v3/product/import` 的每个 `items[]` 都必须提供自己的 `offer_id`、`price`、包装 `depth/width/height/weight` 和图片;尺寸与重量不得为零。一次请求可提交最多 100 个 item。`03-category-attributes.md` 定义 `is_aspect=true` 为区分 SKU 变体的类目属性。
|
||||
|
||||
因此,独立 offer 不是仅为本地方便的选择,而是与 Ozon 导入契约相符的最小稳定粒度。现有本地文档没有描述可通过一个变体组 ID 将多个 import item 强制合并,故发布设计应以独立 offer 为事实来源;前台变体合并只能作为后续经验证的增强。
|
||||
|
||||
## 4. 文档索引
|
||||
|
||||
| 文档 | 内容 |
|
||||
|---|---|
|
||||
| [product-ai-editor.md](./product-ai-editor.md) | 页面信息架构、交互和保存行为 |
|
||||
| [data-model.md](./data-model.md) | SPU/SKU、属性、素材、定价和迁移数据模型 |
|
||||
| [api.md](./api.md) | 编辑页、SKU、素材、定价与 AI 的服务端契约 |
|
||||
|
||||
## 5. 范围与非目标
|
||||
|
||||
本期先完成编辑、校验、草稿保存和可审阅的数据模型。按钮「上架至 Ozon」可以先呈现为不可用或提示“后续开发”,不得在本期调用 Ozon。AI 套图抽屉沿用现有方案能力作为设计基线,具体交互与任务契约另行讨论后开发。
|
||||
|
||||
CSV、Ozon API 直传、库存、审核轮询和前台变体归并均属于后续发布阶段;但字段与接口必须避免妨碍它们。
|
||||
@@ -0,0 +1,100 @@
|
||||
# V2.2 商品 AI 编辑 API
|
||||
|
||||
> 状态:契约设计,尚未实现。所有写接口由服务端验证所有权、单位、继承与状态;前端不可提交计算结果冒充服务端结果。
|
||||
|
||||
## 1. 采集入库与 SKU 归属
|
||||
|
||||
`POST /api/materials` 保持现有商品级采集契约,并新增可选 `variants`。服务端始终落一条父商品和至少一条 SKU:有 `variants` 时逐项创建/更新;没有时创建一条默认 SKU。单规格商品不会省略 SKU 表记录,使编辑页、定价和未来发布永远面对同一模型;字段 `null` 只表示该字段未覆盖默认值。
|
||||
|
||||
```jsonc
|
||||
{
|
||||
"source": { "platform": "1688", "itemId": "123", "url": "https://..." },
|
||||
"texts": ["...现有采集文本..."],
|
||||
"images": ["...现有商品级采集图..."],
|
||||
"variants": [
|
||||
{
|
||||
"sourceVariantKey": "stable-source-sku-id",
|
||||
"variantName": "白色 / 500 ml",
|
||||
"specs": { "颜色": "白色", "容量": "500 ml" },
|
||||
"sourcePrice": 28.5,
|
||||
"physicalMeasurements": {
|
||||
"lengthMm": null, "widthMm": null, "heightMm": null, "netWeightG": null,
|
||||
"status": "missing"
|
||||
},
|
||||
"packageMeasurements": {
|
||||
"lengthMm": null, "widthMm": null, "heightMm": null, "shippingWeightG": null,
|
||||
"status": "missing"
|
||||
},
|
||||
"imageUrls": []
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
服务端按 `platform + itemId + sourceVariantKey` 幂等写入 SKU;改名只更新 `variant_name`,不会创建重复 SKU。只有来源给出可靠 SKU—图片对应关系时,`imageUrls` 才能绑定该 SKU。1688、淘宝、天猫当前没有这种可靠映射时,图片仍作为商品级 `collected_main` / `collected_detail` 候选素材,`imageUrls` 保持空数组。来源口径不明的重量和尺寸不得写入任一 measurements 对象,需保留原始文本并写 `ambiguous`。
|
||||
|
||||
## 2. 读取与草稿保存
|
||||
|
||||
| 接口 | 用途 |
|
||||
|---|---|
|
||||
| `GET /api/products/{product_id}/editor` | 返回父商品、动态属性 schema、SKU 摘要/详情、已选媒体和候选素材统计。 |
|
||||
| `PUT /api/products/{product_id}/editor-draft` | 原子保存父商品、属性、SKU 新增/修改/排序/停用与媒体选择。响应返回规范化完整编辑数据。 |
|
||||
| `GET /api/products/{product_id}/validation` | 返回父商品及逐 SKU 的本地上架校验结果。 |
|
||||
|
||||
`editor-draft` 使用版本号/ETag 防止两个页面静默互相覆盖;版本冲突返回 `409` 和当前版本摘要。复杂的单一操作也提供下列细粒度接口,供弹窗立即保存使用。
|
||||
|
||||
## 3. SKU 与属性
|
||||
|
||||
| 接口 | 用途 |
|
||||
|---|---|
|
||||
| `POST /api/products/{product_id}/variants` | 创建手工 SKU 或复制 SKU,返回新 ID。 |
|
||||
| `PATCH /api/products/{product_id}/variants/{variant_id}` | 修改单个 SKU 字段或恢复继承(字段值传 `null`)。 |
|
||||
| `DELETE /api/products/{product_id}/variants/{variant_id}` | 软删除未发布 SKU;已发布 SKU 改为停用并要求后续发布流程处理。 |
|
||||
| `PUT /api/products/{product_id}/attributes` | 保存通用属性。 |
|
||||
| `PUT /api/products/{product_id}/variants/{variant_id}/attributes` | 保存 SKU/变体属性。 |
|
||||
| `GET /api/products/{product_id}/attribute-schema` | 按当前 `description_category_id + type_id` 返回 Ozon schema、字典选项和 `is_aspect` 标识。 |
|
||||
|
||||
服务端通过 Ozon `/v1/description-category/attribute` 获取 schema,并按 `type`、`is_required`、`is_collection`、`max_value_count` 和字典值校验结构化值。`is_aspect=true` 是默认的 `variant` scope;客户端可显式将业务上按 SKU 区分的非 aspect 属性保存为 `variant` scope。服务端不得因该业务覆盖而丢弃属性,但会在发布校验中按 Ozon 最终 schema 提示兼容性问题。来源采集接口以稳定 `source_variant_key` 做 SKU 幂等,而不按 `variant_name` 匹配。
|
||||
|
||||
## 4. 定价
|
||||
|
||||
| 接口 | 用途 |
|
||||
|---|---|
|
||||
| `POST /api/products/{product_id}/variants/{variant_id}/pricing/quote` | 以请求的编辑值和服务端合并后的包装规格计算预览,不写入售价。 |
|
||||
| `POST /api/products/{product_id}/variants/{variant_id}/pricing/confirm` | 重新计算、校验并保存快照,同时写入 `selling_price`、`old_price`。 |
|
||||
| `GET /api/products/{product_id}/variants/{variant_id}/pricing` | 读取最新确认快照和可解释的告警。 |
|
||||
|
||||
`confirm` 的请求只包含用户可编辑的定价输入;服务端自行读取 SKU 和父商品规格,写入计算结果、公式版本和有效包装规格快照。包装值缺失、`ambiguous`、小于等于零或不满足物流尺寸限制时返回 `422`,不更改原价格。
|
||||
|
||||
## 5. 媒体
|
||||
|
||||
| 接口 | 用途 |
|
||||
|---|---|
|
||||
| `GET /api/products/{product_id}/variants/{variant_id}/media/candidates?group=` | 返回 AI 记录、采集主图、采集 SKU 图、采集详情图;带稳定 SKU 归属的候选项只返回给对应 SKU。 |
|
||||
| `PUT /api/products/{product_id}/variants/{variant_id}/media` | 原子保存该 SKU 图片/视频/封面选中项及顺序。 |
|
||||
| `POST /api/products/{product_id}/assets` | 上传商品级或明确指定 SKU 的候选媒体。 |
|
||||
| `DELETE /api/products/{product_id}/assets/{asset_id}` | 删除未被引用的候选资产;仍被 SKU 选中时返回引用信息并要求先解除选择。 |
|
||||
|
||||
资产引用必须使用 `asset_id` 和 `product_variant_id`,不使用图片 URL 或 SKU 名称作为关联键。
|
||||
|
||||
## 6. AI
|
||||
|
||||
| 接口 | 用途 |
|
||||
|---|---|
|
||||
| `POST /api/products/{product_id}/ai/copy` | 输入通用商品上下文,返回标题、标签、简介、富内容等候选草稿;不直接覆盖数据库。 |
|
||||
| `POST /api/products/{product_id}/ai/model-and-offers` | 为父商品返回型号和每个 SKU 的货号候选;用户确认后通过草稿保存接口写入。 |
|
||||
| `POST /api/products/{product_id}/ai/suite-plans` | 创建套图规划;请求必须显式给出目标 SKU 集合。 |
|
||||
| `POST /api/products/{product_id}/variants/{variant_id}/ai/dimension-image` | 为单 SKU 创建尺寸图任务;服务端固化已确认实物规格快照。 |
|
||||
|
||||
AI 与生图任务沿用现有持久化后台任务模型。任何任务都要保存 `product_variant_id`,且尺寸图额外保存 `physical_measurements_snapshot`;SKU 改名不会丢失任务归属。
|
||||
|
||||
## 7. 后续 Ozon 发布契约
|
||||
|
||||
未来 `POST /api/products/{product_id}/publish` 的内部实现应把每个启用 SKU 转换成一个 `/v3/product/import.items[]`:
|
||||
|
||||
- 父商品标题、描述、类目、通用属性复制到每个 item;
|
||||
- SKU 的 `offer_id`、价格、划线价、包装尺寸/重量、已选图片和变体属性写入对应 item;
|
||||
- 每个 SKU 独立保存 Ozon task item 结果、`ozon_product_id` 和 Ozon SKU;
|
||||
- 请求按最多 100 个 item 分批,单 SKU 失败不应抹掉其他 item 的状态。
|
||||
|
||||
本期不实现该接口;本文仅规定数据与错误归属,避免后续发布阶段重新拆分单商品记录。
|
||||
@@ -0,0 +1,80 @@
|
||||
# V2.2 数据库与领域模型
|
||||
|
||||
> 状态:设计,尚未创建迁移。数据库单位统一为 `mm` 与 `g`。
|
||||
|
||||
## 1. 模型边界
|
||||
|
||||
```text
|
||||
products(父商品 / SPU) 1 ─── N product_variants(可售 SKU / Ozon offer)
|
||||
│ │
|
||||
├── product_attributes ├── product_variant_media ── product_assets
|
||||
├── product_assets(候选池) ├── product_attributes(scope=variant)
|
||||
└── product_pricing_defaults └── variant_pricing_snapshots
|
||||
```
|
||||
|
||||
保留现有 `products` 主键和采集来源字段,以便采集箱和历史链接继续有效;其单 SKU 价格、尺寸、`offer_id` 字段只作为迁移兼容层,V2.2 写路径不再以它们为事实来源。每个父商品至少有一条 `product_variants` 记录:单规格商品拥有默认 SKU,多规格商品拥有多个 SKU;两者不采用不同的数据结构。
|
||||
|
||||
## 2. 父商品 `products`
|
||||
|
||||
新增/规范的核心字段:
|
||||
|
||||
| 字段 | 说明 |
|
||||
|---|---|
|
||||
| `model_code` | 通用型号,所有 SKU 共用;可由 AI 建议,用户可编辑。 |
|
||||
| `title_zh`、`name`、`description` | 中文标题、俄文标题、俄文简介。 |
|
||||
| `rich_content` | 已验证的 JSON 富内容。 |
|
||||
| `barcode` | 当前按业务决策作为通用字段。发布阶段若 Ozon/业务要求 SKU 级条码,再增加显式覆盖字段,不从图片或名称推断。 |
|
||||
| `purchase_url`、`supply_note` | 采买地址和货源备注。 |
|
||||
| `description_category_id`、`type_id` | Ozon 类目和商品类型。 |
|
||||
| `pricing_defaults` | 默认利润率、贴单费、物流等级、划线价倍数、汇率等可继承计价参数。 |
|
||||
| `package_*_default` | 默认包装物流规格;只作为 SKU 的可继承默认值。 |
|
||||
| `physical_*_default` | 默认实物规格;只作为 SKU 的可继承默认值。 |
|
||||
|
||||
历史 `raw` 继续存原始采集文本/参数,绝不可将口径不明的原始“尺寸/重量”自动写入新规格字段。
|
||||
|
||||
## 3. SKU `product_variants`
|
||||
|
||||
| 字段组 | 字段 | 说明 |
|
||||
|---|---|---|
|
||||
| 身份 | `id`、`product_id`、`source_variant_key`、`variant_name`、`specs`、`sort_order`、`enabled` | `source_variant_key` 与来源平台联合唯一;显示名称可以变化或重复。 |
|
||||
| 销售 | `offer_id`、`purchase_price`、`selling_price`、`old_price`、`currency_code` | `offer_id` 对启用 SKU 必须唯一;售价和划线价仅由定价确认或人工编辑写入。 |
|
||||
| 包装物流 | `package_length_mm`、`package_width_mm`、`package_height_mm`、`shipping_weight_g`、`package_measurements_meta` | 用于试算、物流校验和 Ozon import。`null` 表示继承,不表示零。 |
|
||||
| 实物 | `physical_length_mm`、`physical_width_mm`、`physical_height_mm`、`net_weight_g`、`physical_measurements_meta` | 用于尺寸图、规格展示、文案,绝不用于物流计算。 |
|
||||
| 发布 | `ozon_product_id`、`ozon_sku`、`publish_state`、`published_at` | 为一 SKU 一 offer 的后续同步预留。 |
|
||||
| 审计 | `created_at`、`updated_at`、`deleted_at` | SKU 采用软删除,防止丢失历史报价与外部映射。 |
|
||||
|
||||
两组 `*_measurements_meta` 至少存每个字段/字段组的 `status`(`confirmed`、`ambiguous`、`missing`)、来源、原始文本、确认时间。有效值按“SKU 覆盖 → 父商品默认值”逐字段合并;两组规格独立合并。这里的 `null` 仅表示某个可继承字段未覆盖父商品默认值;绝不表示 SKU 记录不存在,也不以此判断商品是否为单规格。
|
||||
|
||||
## 4. 动态属性 `product_attributes`
|
||||
|
||||
类目不同且将来可能持续增加属性,不能靠不断扩展 `products` 列。使用结构化属性表:
|
||||
|
||||
| 字段 | 说明 |
|
||||
|---|---|
|
||||
| `id`、`product_id`、`product_variant_id` | 通用属性只填 `product_id`;SKU 属性还填所属 `product_variant_id`。 |
|
||||
| `scope` | `common` 或 `variant`;数据库约束与两个外键一致。 |
|
||||
| `attribute_key`、`attribute_name` | 本地稳定键和最近一次展示名称。 |
|
||||
| `ozon_attribute_id`、`complex_id` | 已映射时记录 Ozon 属性身份。 |
|
||||
| `values` | JSON 数组,保存文本与可选 `dictionary_value_id`,能表达单值、多值、数值与布尔。 |
|
||||
| `source`、`status` | `collected`/`ai`/`manual` 与 `confirmed`/`ambiguous`/`missing`。 |
|
||||
|
||||
动态属性 schema 来自 Ozon:先由父商品的 `description_category_id + type_id` 调用 `/v1/description-category/attribute`,再按返回的 `id`、`type`、`is_required`、`is_collection`、`max_value_count`、`dictionary_id` 和 `is_aspect` 渲染与校验。`dictionary_id > 0` 时,值通过属性值字典/搜索接口确认 `dictionary_value_id` 后保存。
|
||||
|
||||
通用属性包括品牌、型号、主题标签及默认的类目共有属性。变体属性包括颜色、颜色名称以及 Ozon schema 标记 `is_aspect=true` 的所有属性;`is_aspect` 是默认归属,不是硬编码限制。用户或采集规则可把某个非 `is_aspect` 属性(例如按容量销售的商品的容量)标记为 `variant` scope,并为每个 SKU 保存不同值。`specs` 仅是来源规格的原始/展示快照,不能替代已确认的属性值。
|
||||
|
||||
## 5. 素材与媒体选择
|
||||
|
||||
`product_assets` 保存一次资产事实:`product_id`、可空 `product_variant_id`、`media_type`(image/video)、`source_group`(collected_main/collected_sku/collected_detail/generated/upload)、原始/当前 URL、尺寸、生成任务/规格快照及来源信息。若采集平台无法稳定给出 SKU 归属,`product_variant_id` 必须为 `null`。
|
||||
|
||||
新增 `product_variant_media` 表保存每个 SKU 的已选媒体,而不是复制资产:`product_variant_id`、`asset_id`、`role`(image/video/video_cover)、`sort_order`、`selected_at`。同一商品级素材可安全地被多个 SKU 选用;同一 SKU 的排序独立。发布时仅取该 SKU 已选图片,并执行 Ozon 的图片数量、HTTPS 可访问性等校验。
|
||||
|
||||
## 6. 定价快照
|
||||
|
||||
`variant_pricing_snapshots` 记录不可变的确认结果:SKU、输入参数、合并后的包装物流规格、公式版本、结果、告警、汇率、`calculated_at`、确认人/来源。SKU 表可缓存最新快照 ID 以加速展示;导出或上架时服务端必须以有效包装规格重新校验,不能信任浏览器传回的价格结果。
|
||||
|
||||
## 7. 迁移原则
|
||||
|
||||
1. 每个历史 `products` 记录创建一个默认 SKU,复制原 `offer_id`、价格和 `pricing`。
|
||||
2. 历史 `weight/depth/width/height` 迁入默认 SKU 的包装物流规格,因为旧字段只服务于试算;实物规格标记 `missing`。
|
||||
3. 历史素材先保留为商品级候选素材;不根据 `variant_name` 倒推 SKU 绑定。
|
||||
4. 新读路径优先 `product_variants`;在迁移完成前,旧字段只读兼容,禁止双向覆盖。
|
||||
@@ -0,0 +1,92 @@
|
||||
# 商品 AI 编辑页设计
|
||||
|
||||
> 状态:需求设计,尚未开发。
|
||||
|
||||
## 1. 路由与页面定位
|
||||
|
||||
建议以 `/product/:id` 作为新页面路由,直接替换旧商品编辑页,从而保留现有列表、链接和深链兼容性;页面标题为「商品 AI 编辑」。旧页面组件移除前先完成数据迁移和路由切换。`/trial/:id` 不再承接新功能,完成迁移后引导用户使用新页。
|
||||
|
||||
页面编辑的是一个父商品和其 SKU 集合。它不是按 SKU 复制的多张商品表单:通用信息只维护一次,SKU 卡片只维护可售单元差异。**单规格商品也创建并展示一张默认 SKU 卡片**,因此所有商品都用相同的定价、素材、货号和发布流程。
|
||||
|
||||
## 2. 页面结构
|
||||
|
||||
```text
|
||||
页头:返回 · 商品中文名 / 俄文标题 · 草稿状态 · 来源链接
|
||||
├─ 商品通用信息
|
||||
│ ├─ 类目、标题、品牌、型号、主题标签、简介、JSON 富内容
|
||||
│ ├─ 条形码、采买地址、货源备注
|
||||
│ └─ 类目属性(由当前 Ozon 类目动态渲染)
|
||||
├─ SKU 商品
|
||||
│ ├─ 显示模式:卡片(默认) / 紧凑列表
|
||||
│ ├─ SKU 卡片 × N
|
||||
│ └─ 新增、复制、停用、删除 SKU
|
||||
└─ 固定操作栏
|
||||
├─ 左:一键生成标题/标签/描述 · AI 套图生成
|
||||
└─ 右:取消并关闭 · 保存草稿 · 上架至 Ozon(后续)
|
||||
```
|
||||
|
||||
页面不采用现有 onBlur 即写库模式。页面保存一个编辑草稿;「保存草稿」以一个事务提交父商品、变更的 SKU、属性和素材顺序。关闭存在未保存改动时提示确认。定价确认是例外:确认后立刻写入该 SKU 的价格和定价快照,同时在页面草稿中同步结果。
|
||||
|
||||
## 3. 通用信息区
|
||||
|
||||
以下字段属于父商品,全部 SKU 共享:类目、标题、品牌、型号、主题标签、简介、JSON 富内容、条形码、采买地址、货源备注,以及后续增加的商品级字段。
|
||||
|
||||
- 标题应保存中文采集标题和可编辑的俄文发布标题;AI 生成后先填入编辑草稿,由用户检查后随“保存草稿”持久化。
|
||||
- 类目变更会刷新该类目的 Ozon 属性 schema。已填写但不再属于新类目的属性保留为未映射草稿,不自动带到发布 payload。
|
||||
- 类目属性不硬编码到前端。前端按后端返回的 Ozon schema 显示必填、字典、数值、多值和变体属性提示:`is_aspect=true` 默认展示在 SKU 属性区,其他属性默认展示在通用区。
|
||||
- `is_aspect` 是 Ozon 的默认归属依据,不是不可推翻的业务限制。比如容量在某类目不是 `is_aspect`,但采购规格实际按容量拆分时,用户可将它标记为 SKU 属性;保存后该属性在每个 SKU 上独立编辑和发布。
|
||||
- 「JSON 富内容」保存为经过 JSON 校验的结构化值,而不是一段不可验证文本。
|
||||
|
||||
## 4. SKU 区
|
||||
|
||||
### 4.1 默认卡片,兼顾紧凑列表
|
||||
|
||||
默认使用卡片,方便图片、视频和多组规格编辑;切换到紧凑列表时只改变展示,不改变编辑数据。列表列为:序号、SKU 名称、图片缩略图、视频封面、视频、货号、采购价、售价、划线价、包装规格、实物规格、商品颜色、颜色名称、状态和操作。
|
||||
|
||||
卡片显示:
|
||||
|
||||
- 头部:序号、SKU 名称、启用状态、复制/删除;
|
||||
- 媒体:最多展示 3 张缩略图,可在偏好中改为 5 张;视频封面与视频状态单独展示;
|
||||
- 销售:货号、采购价、售价、划线价,以及「定价」按钮;
|
||||
- 规格:包装物流(长宽高、包装毛重)和实物(长宽高、净重)两个明确区块;
|
||||
- 变体属性:商品颜色、颜色名称以及当前类目所有 `is_aspect=true` 的属性。
|
||||
|
||||
SKU 名称是展示名,不可作为同步键。每项始终保存来源的稳定 SKU 标识;没有来源标识的手工 SKU 由本地 UUID 标识。SKU 的存在不依赖字段是否已填写:规格字段的空值只代表“未覆盖父商品默认值”,不代表单规格商品或缺少 SKU。
|
||||
|
||||
### 4.2 定价弹窗
|
||||
|
||||
点击某一 SKU 的「定价」后打开弹窗,默认读取并显示该 SKU 的 **有效包装物流规格**(SKU 覆盖值优先,再读父商品默认值)。弹窗允许修改采购价、利润率、贴单费、物流等级、划线价倍数、汇率和包装规格;不显示为常驻结果卡。
|
||||
|
||||
服务端计算并返回物流校验、价格建议、人民币/卢布结果。用户点击“确认定价”后:
|
||||
|
||||
1. 保存本次输入和有效包装规格快照;
|
||||
2. 保存计算结果和计算时间;
|
||||
3. 将卢布销售价回填 SKU `selling_price`,划线价回填 `old_price`;
|
||||
4. 若包装规格缺失、待确认或尺寸校验失败,则不得确认。
|
||||
|
||||
实物规格绝不进入物流计算。若实物规格缺失,定价仍可完成;但该 SKU 的尺寸图按钮不可用。
|
||||
|
||||
### 4.3 SKU 图片编辑弹窗
|
||||
|
||||
点击 SKU 的图片区域打开素材编辑弹窗:
|
||||
|
||||
```text
|
||||
左侧:该 SKU 已选图片(可排序、删除;限制由发布规则校验)
|
||||
右侧:AI 生图记录 | 采集主图 | 采集 SKU 图 | 采集详情图
|
||||
```
|
||||
|
||||
用户从右侧候选素材选择后加入左侧,完成后保存该 SKU 的选图顺序。采集主图和详情图是商品级候选池,可被多个 SKU 选择;采集到且有稳定 SKU 归属的 SKU 图默认只出现在对应 SKU 的候选池。AI 生成结果必须记录生成上下文所绑定的 SKU,不能只凭显示名称匹配。
|
||||
|
||||
视频封面和视频沿用相同的“候选资产 + SKU 已选媒体”机制,但不与图片混排。发布时按 Ozon 支持能力再确定其序列化方式。
|
||||
|
||||
## 5. AI 操作
|
||||
|
||||
- 「一键生成标题、标签、描述等信息」只针对父商品;服务端返回按字段区分的候选内容和依据,前端将选中的结果填入草稿。
|
||||
- 「AI 套图生成」从左侧抽屉展开。抽屉以现有试算页套图规划、风格、要求、模型、任务进度和结果为基线,但需要显式选择目标 SKU;尺寸图任务必须一 SKU 一任务并固化实物规格快照。
|
||||
- AI 生成不得覆盖用户已编辑字段或已选图片。覆盖只能由用户在结果应用时显式确认。
|
||||
|
||||
## 6. 编辑与校验状态
|
||||
|
||||
SKU 卡片状态建议显示为:`草稿`、`待补全`、`可定价`、`已定价`、`可上架`、`已停用`。其中“可上架”仅表示本地校验通过,不代表已调用 Ozon。
|
||||
|
||||
本地“可上架”最低条件:父商品类目、俄文标题、简介、必填通用/类目属性齐全;每个启用 SKU 有唯一货号、有效售价、有效包装物流规格、所需图片和 SKU 必填属性。实际 Ozon 发布仍须重新做一次服务器端校验。
|
||||
Reference in New Issue
Block a user