feat(edit): 编辑上报细节优化
This commit is contained in:
@@ -24,6 +24,8 @@
|
||||
|
||||
Headers:扩展 Bearer token 与 `Idempotency-Key` 必填。请求体为已定义的 `CollectedProductPayload`,其 `source` 至少包含 `platform`、`itemKey`、`canonicalUrl`、`collectedAt`、`parserVersion`;`variants` 仅列来源有稳定证据的真实组合,媒体只传来源 URL、`mediaType`(`image` / `video`)、可选 `posterUrl`、关系和证据,不传二进制。
|
||||
|
||||
2026-10-06 SKU 容量修订:单次采集的 `variants` 上限从 100 提高到 1000,商品草稿完整保存采用同一上限,以支持真实多 SKU 来源商品从采集进入编辑。插件本地校验和 API 共享同一常量 `PRODUCT_VARIANT_LIMIT`;超过 1000 时明确提示「单个商品最多支持 1000 个 SKU」,整个采集失败,不截断 SKU 或创建部分商品。此限制不等于工作空间采集商品数配额,也不改变首次发布每批最多 50 个 SKU、媒体候选和其他字段的既有约束。采集响应 `collection_item.variant_count` 返回该商品实际未删除 SKU 数,复采仍保持商品和同 key SKU 身份。
|
||||
|
||||
请求体不得包含或传入 `workspace_id`、`target_platform_id`、`platform_id`、`store_id`、`api_key`、Cookie、授权头或来源站会话字段。服务端从扩展令牌解析工作空间,并将来源 `platform` 映射为系统已启用的来源平台。
|
||||
|
||||
服务端在一个事务中:检查工作空间采集箱上限 → 按 `workspace + source_platform + source_item_key` 查找活动记录 → 创建记录,或以本次页面快照覆盖已有记录的来源 URL、标题、价格、原始证据、规范化载荷与候选素材。采集阶段的图片和视频只保存为 `pending_selection` 候选记录,**不下载媒体、不投递素材 Worker**;用户在编辑流程中选择媒体后,才调用按需转存接口。重复上报不会增加采集箱配额,且会保留原有 `collection_item` 与 `product` ID;旧快照中尚未完成的候选或任务会被取消,新快照使用新的来源快照版本,旧 Worker 不得回写新快照。
|
||||
@@ -32,13 +34,15 @@ Headers:扩展 Bearer token 与 `Idempotency-Key` 必填。请求体为已定
|
||||
|
||||
1688 结构化采集以 `skuModel.skuInfoMap` 的真实可售记录生成 SKU;每条记录的 `price`(CNY)按两位小数四舍五入后写入对应 SKU 的 `purchase_cost_cny`,`skuProps.value` 中按规格名称匹配的图片作为带 `variantSourceKey` 的 `source_sku` 候选。尚无平台编辑草稿时,重复采集会刷新来源采购价;进入编辑器后不覆盖用户修改过的采购价。SKU 对应的来源图片可在编辑页预览,用户选择后才转存并保存为正式主图。
|
||||
|
||||
2026-10-05 货源地址修订:插件已通过 `source.canonicalUrl` 上报商品详情页地址(1688、淘宝、天猫、Ozon 均适用)。新建商品时同时初始化 `products.purchase_url`,供编辑器「货源链接」使用。编辑快照的 `product.common.purchase_url` 优先返回手工保存的非空链接,未填写时回退该采集记录的 `source_url`,使历史已采集商品无需重新采集即可显示来源地址;手动创建且无来源地址的商品仍为空。重复采集更新来源地址,已填写的商品货源链接保持不变;清空货源链接表示恢复使用采集来源地址。接口字段结构不变。
|
||||
|
||||
成功返回 `201`(新建)或 `200`(复用):
|
||||
|
||||
```json
|
||||
{ "data": {
|
||||
"collection_item": { "id": "uuid", "status": "ready_for_edit", "source_title": "商品标题", "variant_count": 3 },
|
||||
"product_id": "uuid", "reused": false, "refreshed": false,
|
||||
"editor_entry_path": "/products/uuid",
|
||||
"editor_entry_path": "/products/product-uuid/editor?collection_item_id=collection-uuid",
|
||||
"materialization": { "total": 12, "pending_selection": 12, "queued": 0, "succeeded": 0, "failed": 0 }
|
||||
} }
|
||||
```
|
||||
@@ -130,4 +134,4 @@ Headers:`Idempotency-Key` 必填。先由列表读取 `active_count` 并展示
|
||||
|
||||
## 6. 与商品编辑接口的边界
|
||||
|
||||
`editor_entry_path` 只是 ERP 前端入口。下一批商品编辑接口会在用户进入该入口时根据页头目标平台取得/创建 `product_platform_profile`、预选默认店铺、允许切换同平台店铺,并定义 SKU 编辑、AI、定价确认、图片选择与仅未导入 SKU 的首次上架。
|
||||
2026-10-05 插件入口修订:插件采集返回的 `editor_entry_path` 为 `/products/{product_id}/editor?collection_item_id={collection_item_id}`。「编辑上架」采集成功后打开此地址并提示「已打开商品编辑页」;「采集商品」仍只采集、不打开编辑页。新采集和重复采集均使用响应的真实商品 ID,复采继续进入原商品。入口携带的采集记录 ID 供 Web 在当前页头平台下调用 `POST /api/collection-items/{id}/editor-contexts` 初始化或复用上下文,再读取商品编辑快照;返回的商品 ID 必须与路径一致。无默认店铺时保留已有 `DEFAULT_STORE_REQUIRED` 提示,不在采集接口中猜测目标平台或绑定店铺。已有上下文沿用用户编辑资料和发布状态,不重复上架。手动创建的旧 `/products/{product_id}` 入口及采集测试页路由仍保留。
|
||||
|
||||
+6
-2
@@ -45,7 +45,7 @@
|
||||
}
|
||||
```
|
||||
|
||||
- 独立试算 `binding=null`;SKU 必须提供 profile,已有 variant_id 与新建 client_key 二选一。验证资源归属,已上架 SKU 不接受新报价。
|
||||
- 独立试算 `binding=null`;SKU 必须提供 profile,已有 variant_id 与新建 client_key 二选一。验证资源归属;已上架 SKU 允许试算和确认新的本地报价记录(2026-10-05 修订),不更新 Ozon 线上价格或重复导入。
|
||||
- 包装输入是编辑草稿合并后的有效 g/mm 值,必须已确认;接口为兼容历史值允许最多三位小数,重量至少 1 g,当前编辑页与试算界面只接受正整数。保存时从实际持久化草稿重新合并并核对,不能仅信任客户端摘要。
|
||||
- `mode=target_markup`:目标利润=采购成本×加价率;求解销售价。`fixed_sale`:selling_price 必填,按该售价核算利润。
|
||||
- 百分比费用以销售额为基数;除加价率外每项小于 1、最多六位小数。引擎拒绝总扣费率≥1。划线价=销售价÷(1−折扣率)。
|
||||
@@ -83,6 +83,8 @@ context 保存规则版本、实际汇率与来源,以及系统汇率记录 ID
|
||||
- 发布校验要求 pricing_valid=true,无有效报价返回 `PRICING_REQUIRED`;已导入 SKU 沿用既有不可再次首次上架边界。
|
||||
- 数据库复合外键保证 quote/profile/product/variant/store/platform 归属,RLS 隔离租户。确认快照拒绝 UPDATE;成本、包装、类目、店铺或币种变化触发失效。
|
||||
|
||||
2026-10-05 维护者要求:已导入 SKU 展示「重新试算」「试算详情」。点击重新试算、详情「应用到 SKU」前确认:「该 SKU 已上架。本次价格调整仅保存为本地记录,不会同步至 Ozon;如需修改线上价格,请前往 Ozon 后台。」确认后回填草稿,仍须保存商品才持久化新报价。沿用已有预览绑定、有效期、规则、币种、输入一致性和幂等校验,新建不可变报价并更新本地 listing 价格,不修改 listing 的 imported 状态、首次导入店铺、货号或平台商品身份,不创建发布任务或价格同步任务。未携带新 `pricing_selection` 的已导入 SKU 保持既有报价记录。批量「按方案计算全部」和自动试算继续跳过已导入 SKU,避免批量隐式调整其记录。
|
||||
|
||||
## 4. 门店方案
|
||||
|
||||
| 方法 | 路径 | 约束 |
|
||||
@@ -96,7 +98,9 @@ context 保存规则版本、实际汇率与来源,以及系统汇率记录 ID
|
||||
写入 `{name,note,parameters,allow_commission_override}`。只保存费用、加价、折扣、固定/系统汇率与运输偏好;采购价、包装、手动售价及临时佣金不属于方案持久字段。
|
||||
方案的默认和比较运输必须属于同一可用费率卡;正式环境默认允许有效草稿卡;可通过 `PRICING_ALLOW_DRAFT_RATES=false` 仅使用已审核卡。历史快照不会被方案修改;尚未确认的预览因方案版本改变要求重算。
|
||||
|
||||
2026-10-04 维护者确认:SKU「重新试算」与「按方案计算全部」主动重读目标店铺 `/pricing/catalog`,使用最新 `is_default=true` 方案的完整参数(包含加价、折扣、费用、运输与汇率偏好),替换 SKU 的旧定价参数再生成预览;沿用当前采购成本和有效包装,不自动保存商品。无默认方案或其费率卡不可用时给出明确提示,不静默使用折扣率为 0 的临时参数。已导入 SKU 不重算。自动试算、手工实际售价调整和试算详情内的重新计算继续使用当前 SKU/详情参数。默认方案折扣率为 50% 时,划线价=实际售价÷(1−50%)=实际售价×2。
|
||||
2026-10-04 维护者确认:SKU「重新试算」与「按方案计算全部」主动重读目标店铺 `/pricing/catalog`,使用最新 `is_default=true` 方案的完整参数(包含加价、折扣、费用、运输与汇率偏好),替换 SKU 的旧定价参数再生成预览;沿用当前采购成本和有效包装,不自动保存商品。无默认方案或其费率卡不可用时给出明确提示,不静默使用折扣率为 0 的临时参数。批量计算跳过已导入 SKU;2026-10-05 开放已导入 SKU 单项主动试算,仅更新本地记录。自动试算、手工实际售价调整和试算详情内的重新计算继续使用当前 SKU/详情参数。默认方案折扣率为 50% 时,划线价=实际售价÷(1−50%)=实际售价×2。
|
||||
|
||||
编辑快照的 `variants[].listing.store_id` 返回当前 listing 的实际归属店铺。已导入 SKU 试算固定使用其首次导入店铺(包括目录方案与币种),即使商品的目标店铺已改为其他店铺也不改写导入归属;预览使用其他店铺时返回 `422 PRICING_VARIANT_STORE_MISMATCH`。
|
||||
|
||||
## 5. 数据启用与错误
|
||||
|
||||
|
||||
@@ -18,6 +18,8 @@ Headers:`Idempotency-Key` 必填,页头平台由 header 指定,body 为空
|
||||
- 已存在 profile 时只读取,绝不因再次进入而覆盖用户已选门店、类目、属性或价格;
|
||||
- 不创建跨平台 profile,也不改变其他平台的上架状态。
|
||||
|
||||
插件「编辑上架」打开 `/products/{product_id}/editor?collection_item_id={collection_item_id}` 时,Web 先按页头当前平台调用此接口。核对响应 `product_id` 与路径一致后读取编辑快照,使首次采集和既有草稿均进入对应商品编辑页;采集接口本身不创建编辑上下文。
|
||||
|
||||
返回:
|
||||
|
||||
```json
|
||||
@@ -102,6 +104,8 @@ Headers:`Idempotency-Key` 必填,页头平台由 header 指定,body 为空
|
||||
|
||||
供应商异步任务返回终态失败时不再轮询或重试同一任务 ID。只有供应商明确返回内容政策或审核错误码时才使用稳定错误码 `AI_IMAGE_CONTENT_REJECTED`;笼统的 `failed`(即使消息称“可能”涉及安全政策)及其他供应商终态失败使用 `AI_IMAGE_PROVIDER_FAILED`;提交、网络、存储等非终态问题在重试耗尽后使用 `AI_IMAGE_GENERATION_FAILED`。Worker 在终态失败或重试耗尽时把失败来源、步骤和脱敏摘要写入同工作空间的 operation 结果;用户界面显示阶段和摘要,并在任务卡片展示已取得的 Pcore 原始错误内容。历史任务若原先未保存错误内容,则相关字段为 `null`。
|
||||
|
||||
Pcore 返回的图片地址若与服务端 `PCORE_BASE_URL` 同源,且严格对应当前已保存任务的 `/v1/images/content/{provider_task_id}/0`(无凭据、查询参数和片段),Worker 将其作为供应商任务 API 读取:从配置地址与任务 ID 重新构造 HTTPS 请求,保持 TLS 校验,不发送 API Key,不跟随重定向,下载上限 25 MiB,后续仍校验实际图片格式和尺寸。该受控接口沿用供应商 API 的系统网络解析,可在开发代理 Fake-IP DNS 环境下工作;不将 Fake-IP 地址加入通用下载白名单。外部图片地址继续校验公网 IPv4 并固定连接地址;同源但不匹配当前任务的路径直接拒绝。此处理共用于单张编辑与套图,不改变 HTTP 接口字段或任务状态契约。
|
||||
|
||||
生成结果先在单张 AI 编辑抽屉中预览。用户点击“添加到当前 SKU”后,新素材插入原图后方,原图保留;选图弹窗“确认”仅写入编辑页表单,页面“保存”后才持久化 SKU `media_asset_ids`。关闭或取消编辑不修改 SKU 草稿。图片源、参考图、结果均受工作空间隔离;任务输出与源图分别存储。
|
||||
|
||||
`PUT /api/products/{product_id}/editor-draft`
|
||||
@@ -141,14 +145,15 @@ Headers:`If-Match: "{product_revision}:{profile_revision}"`、`Idempotency-Key
|
||||
- 保存来源素材不会修改原始采集证据。`ai_source_overridden_fields` 只允许 `title`、`description`、`price`、`brand`、`attributes`、`categories`,且每项按完整顶层值覆盖,不做数组或对象内部的隐式合并。
|
||||
- `profile.platform_product_category_id` 必须是当前平台的活动类目;同平台门店共享类目、类型属性和字典缓存。服务端从平台类目记录取得 `platform_type_id`,客户端不能伪造类型 ID。过渡期仍接受 `store_product_category_id`,但只用于按 `description_category_id + type_id` 映射平台类目,不参与当前读取和校验。
|
||||
- 类目切换或平台 schema 移除属性时,原有不再适用的属性不会进入新的发布草稿;服务端将它们写入 `unmapped_attributes` 并在编辑快照中返回。用户删除 SKU 时,其 SKU 属性随 SKU 一起移除,不生成无主未映射属性。
|
||||
- `variants` 是当前完整未删除 SKU 集合。省略既有 SKU 表示软删除;无论当前 SPU 状态都允许新增、复制、删除。`copy_from_variant_id` 仅用于新行,复制通用 SKU 数据但不复制任何平台导入映射,生成的新 SKU 从 `not_listed` 开始。
|
||||
- `variants` 是当前完整未删除 SKU 集合,最多 1000 项(2026-10-06 从 100 提高,与采集载荷共享 `PRODUCT_VARIANT_LIMIT`)。省略既有 SKU 表示软删除;无论当前 SPU 状态都允许新增、复制、删除。`copy_from_variant_id` 仅用于新行,复制通用 SKU 数据但不复制任何平台导入映射,生成的新 SKU 从 `not_listed` 开始。超出上限返回字段校验错误且不部分保存;首次发布每批最多 50 个 SKU 的独立限制保持不变。
|
||||
- `variants[].purchase_cost_cny` 是人民币采购价,编辑快照以两位小数字符串返回;草稿输入最多两位小数。来源采集写入时按两位小数四舍五入。
|
||||
- 删除已导入 SKU 只从 Atlas 草稿及当前平台可发布集合移除,**不删除、不下架、不修改** Ozon 商品或在线镜像;其他平台历史映射保留。删除后当前平台只剩已导入 SKU 时,SPU 汇总自然为“已上架”。
|
||||
- `null` 的 SKU 规格字段表示继承父商品;包装物流规格的 `status` 为 `missing`/`ambiguous` 时,不允许定价确认或首次上架,但仍允许保存草稿。发布前服务端必须对每个待发布 SKU 解析 `effective_package_spec`,确认长、宽、高、重量均存在且大于 0 后才可生成 Ozon item。实物规格不用于物流;是否向 SPU 或 SKU 展示由其对应的类目 schema 属性决定,尺寸图仍可使用已确认的有效实物规格。
|
||||
- `target_store_id` 只能是当前工作空间、当前平台的活动店铺。变更目标店铺只更新**尚未导入** listing 的将来发布目标;`imported` listing 永远保留其首次导入时的店铺快照。
|
||||
- 类目变化后不匹配的旧属性作为未映射草稿返回 warnings,不能自动进入发布 payload。属性由平台 schema 校验 `type`、必填、字典、多值/复杂属性和 `is_aspect`;客户端不能用任意 JSON 绕过。
|
||||
- `media_asset_ids` 是本 SKU 当前平台的最终选图顺序;最多 30 张。格式只允许 JPG/PNG/WebP,单文件最多 20 MB,边长超过 10,000 px 拒绝,短边小于 700 px 不得作为首图并给出警告。第一张是主图。已完成的 `product_image` 上传素材和网络导入素材可供同工作空间的 SKU 选择;当前商品成功的水印与 3:4 处理结果也可选择。采集图片仍须先转存,且来源变体须匹配。
|
||||
- `media_asset_ids` 是本 SKU 当前平台的最终选图顺序;最多 30 张。格式只允许 JPG/PNG/WebP,单文件最多 20 MB,边长超过 10,000 px 拒绝,短边小于 700 px 不得作为首图并给出警告。第一张是主图。已完成的 `product_image` 上传素材和网络导入素材仅可供所属商品的 SKU 选择;当前商品成功的水印与 3:4 处理结果也可选择。采集图片仍须先转存,且来源变体须匹配。
|
||||
- `common.model` 是用户手填或主动 AI 填报的商品型号;采集时允许为空,但每次首次上架前必须非空。`offer_id` 是用户手填或主动 AI 填报的目标平台卖家货号;采集入箱时不填值,生成时不直接复用 `source_sku`。草稿可为空,但每个待首次上架 SKU 的 `offer_id` 必须非空且在同一店铺/平台唯一。AI 填报接口和回填规则见[方案](../product/ai-autofill-plan.md)。
|
||||
- 商品编辑器的货号控件固定展示 `common.model + "-"` 前缀,用户只编辑 SKU 后缀;请求中的 `offer_id` 仍为完整货号,无新增字段。未导入 SKU 修改型号时保留后缀、同步前缀;后缀为空时货号仍为空。旧货号匹配当前型号前缀时拆出后缀,否则将完整旧值保留为后缀,补前缀只进入待保存草稿,不批量改写历史数据。AI 回填遵循相同组合方式。完整货号继续限制 50 字符,导入/进行中 SKU 保留原货号并只读,已有型号锁定规则继续生效。
|
||||
- `common.source_title` 在编辑页显示为“中文商品名”;`profile.title` 显示为“俄文标题”。`profile.title_mode` 为 `common` / `variant`,编辑快照必须返回当前模式,保存草稿时可传入;旧客户端省略时保留原模式,新商品默认为 `common`。切到 `variant` 时清空并禁用 SPU 俄文标题,在各 SKU 展示标题输入;切回 `common` 时经确认清空所有 SKU 俄文标题,恢复 SPU 输入。两种模式均允许空白草稿;首次上架预检在 `common` 模式检查 `profile.title`,在 `variant` 模式逐个检查待发布 SKU 的 `variants[].title`,缺失时返回 `PUBLISH_TITLE_REQUIRED`。草稿仍须携带有效的 `target_store_id` 作为店铺上下文,并遵守已填写字段的格式和长度约束。SKU 标题 `variants[].title` 为 `null` 时在旧覆盖语义下继承 `profile.title`,不回退到 `display_name`;新版逐 SKU 模式不允许发布时依赖该继承。现有 SKU `tags=[]`、`description=null` 保持继承语义。标题、标签、描述分别独立覆盖。中俄对照按 SPU/SKU 与字段随 `editor-draft` 原子保存;SKU 继承项直接引用 SPU 对照,手工俄文覆盖但无匹配中文时标为对照待更新。发布适配器使用 SKU 有效文案仍是后续工作。
|
||||
|
||||
成功返回新 `product.revision`、`profile.revision`、创建的 SKU ID/`client_key` 映射和 warnings。任一字段、属性或媒体无效时返回 `422` 且不部分保存;版本冲突返回 `409 VERSION_CONFLICT`,客户端应重新读取编辑快照。
|
||||
@@ -175,6 +180,8 @@ Headers:`If-Match`、`Idempotency-Key` 必填。Body:`{ "target_store_id": "
|
||||
|
||||
当前 profile 必须已有平台类目。响应包含 `{ items, cache }`;字段 schema 额外返回 Atlas `attribute_id`,供字典接口精确限定属性作用域,其余字段包括 `platform_attribute_id`、`complex_id`、名称、`value_type`、`is_required`、`is_collection`、`max_value_count`、`dictionary_id`、`is_aspect` 与 `editor_field`。`editor_field` 只按 Ozon 属性 ID 计算,不允许按名称或翻译文本匹配:品牌 `85 → brand`、型号名称 `9048 → model`、类型 `8229 → category`、主题标签 `23171 → tags`、JSON 富内容 `11254 → rich_content`、简介/产品描述 `4191 → description`,其他 ID 返回 `null`。可带 `?category_id={platform_category_uuid}` 预览尚未保存的新类目 schema。
|
||||
|
||||
商品颜色按 Ozon 属性 ID `10096` 识别,允许每个 SKU 选择最多 100 个有效字典值。此业务规则统一用于编辑、草稿保存和发布快照,优先于目录中 `is_collection=false` / `max_value_count=1` 的单值标记;其他属性继续遵守自身 schema。草稿仍保存字典值 ID,发布时逐项映射为 `{ dictionary_value_id, value }`,不得只保留第一个颜色或合并成一条文字值。Web 已选标签保留对应名称,初始化时加载颜色字典;名称加载前可使用已知颜色的俄文名称兜底,编号不作为颜色文本显示。
|
||||
|
||||
`cache.status` 为 `fresh | stale | expired | missing`,并返回 `last_success_at`、`fresh_until`、`expires_at`、`is_complete`、`refresh_run_id`、`refresh_status` 和 `retry_after_ms`。fresh 直接返回;stale 返回旧 schema 并创建或复用低优先级平台任务;expired/missing 创建或复用高优先级平台任务并最多等待 5 秒,仍未完成时以 HTTP `202` 返回空 `items` 和缓存状态。API 不直连 Ozon。
|
||||
|
||||
`GET /api/product-platform-profiles/{profile_id}/attribute-dictionaries/{attribute_id}?q={keyword}&cursor={opaque}`
|
||||
@@ -259,6 +266,8 @@ Body:`{ "variant_ids": ["uuid", "uuid"] }`,最多 50 个且不能重复。
|
||||
|
||||
服务端核对预览归属、15 分钟有效期、当前采购价、有效包装、类目、门店、币种及规则版本,再写入不可变 `pricing_quotes`、全部候选和 listing 价格。任何一个明确选择的报价失效,整个商品保存回滚。客户端可提示用户重新计算,或经用户选择清除本次确认意图后仅保存草稿。
|
||||
|
||||
已上架(`imported`)SKU 可通过「重新试算」或「试算详情 → 应用到 SKU」显式选择新报价。应用前提示「该 SKU 已上架。本次价格调整仅保存为本地记录,不会同步至 Ozon;如需修改线上价格,请前往 Ozon 后台。」取消不应用报价,确认后仍须保存商品。编辑快照 `variants[].listing.store_id` 返回首次导入店铺,已上架 SKU 按此店铺试算和保存,不能改用 profile 后来选择的目标店铺。服务端仅在携带 `pricing_selection` 时更新其本地报价引用和价格;普通草稿保存保留原报价。首次导入状态、店铺、货号、平台商品 ID 和导入时间不变,不创建发布任务或价格同步任务。
|
||||
|
||||
没有报价时仍可保存商品,但首次发布预检返回 `PRICING_REQUIRED`。已确认报价不会随预览到期而失效;采购、包装、目标门店/类目、履约或门店币种改变后须重新确认。调整默认方案、汇率或费率不会反向改写历史快照。详见[定价 API](./pricing.md)。
|
||||
|
||||
经维护者 2026-09-29 确认,使用草稿物流费率卡完成的报价可以保留到首次发布预检;未审核状态只作为来源信息展示,不再生成 `PRICING_RATE_REVIEW_REQUIRED`。当前仍要求 SKU 已确认有效报价、售价、包装和其他发布必填数据。生产环境默认可使用草稿卡,管理员可通过 `PRICING_ALLOW_DRAFT_RATES=false` 限制其进入新试算;审核流程仍可用于核实费率。
|
||||
@@ -288,11 +297,20 @@ AI 填报接口只创建异步任务并返回 `202` + `ai_task_id`,不直接
|
||||
| 接口 | body 核心字段 | 成功结果 |
|
||||
|---|---|---|
|
||||
| `POST /api/product-platform-profiles/{profile_id}/ai/autofills` | 可选 `hint` 与策略开关;Header 必填 `Idempotency-Key` | 一次创建类目、型号、未导入 SKU 货号、可证包装规格及中俄文案的填报任务。Ozon 来源先运行确定性类目匹配;其他来源使用受限类目树候选。 |
|
||||
| `POST /api/product-platform-profiles/{profile_id}/variants/{variant_id}/ai/copy` | 可选 `hint`(用户描述/生成要求,去除首尾空白后最多 1000 字符);Header 必填 `Idempotency-Key` | 为指定 SKU 创建中俄文案任务,固化用户要求与商品输入;返回 `202`、`ai_task_id` 和 `queued`。 |
|
||||
| `POST /api/products/{product_id}/ai/suite-plans` | `variant_id`、底图、套图资料与配置 | 创建显式绑定一个目标 SKU 的异步逐张规划;生成由 `POST /api/products/{product_id}/ai/image-suites` 提交。详见 [套图契约](./product-image-suites.md)。 |
|
||||
| `POST /api/product-platform-profiles/{profile_id}/variants/{variant_id}/ai/dimension-images` | 可选样式 | 固化该 SKU 合并后的**实物**规格快照;实物规格缺失/待确认返回 `422`。 |
|
||||
|
||||
`GET /api/product-ai-tasks/{ai_task_id}` 返回任务状态、输入版本、脱敏结果或错误;全局填报成功时返回类目或候选、型号、逐 SKU 货号、可证包装建议及 SPU 中俄文案,不生成 SKU 文案。单 SKU 文案由 `POST /api/product-platform-profiles/{profile_id}/variants/{variant_id}/ai/copy` 单独创建任务,在弹窗预览并由用户应用。Ozon 动态类目属性不属于当前 AI 填报范围,仍通过类目确认后加载的 schema 由用户填写。歧义类目仍需用户选择。中文对照与俄文在下一次 `editor-draft` 中一同保存,读取编辑上下文时一同返回。
|
||||
|
||||
单 SKU 文案中的 `hint` 是本次用户直接提供的描述、事实修正与生成要求,优先于采集标题、描述、旧 SKU 资料及已有文案;发生冲突时使用用户明确的修正,未修正的事实从当前 SKU 与来源资料补充。采集资料中的命令只当作资料,不可覆盖用户要求。JSON、中俄配对、俄文发布字段、标题及标签格式等输出契约继续生效。该要求只固化在本次 AI 任务输入中,不自动改写采集信息或商品草稿。修改要求会使弹窗旧结果失效,须重新生成后才能应用;关闭或切换 SKU 后,旧异步结果不能回填新弹窗。
|
||||
|
||||
应用当前 SKU 的标题结果而需从通用模式切换为逐 SKU 时,其他 SKU 原先继承的通用标题及对应中文对照转为各自的草稿值,继续保留其有效内容;仅当前 SKU 使用新生成结果。用户手工切换标题模式的原有清空规则不变。
|
||||
|
||||
### 2026-10-05 货源链接来源回填
|
||||
|
||||
编辑快照 `product.common.purchase_url` 优先返回商品手工保存的非空链接;为空时返回关联采集记录的 `source_url`,手动创建且无来源时仍为 `null`。插件已上报 `source.canonicalUrl`,新采集商品据此初始化货源链接;历史商品只在读模型中回退,不批量修改草稿或 revision。手工非空链接不因重复采集覆盖;保存 `null` 表示恢复使用采集来源地址。请求/响应字段及链接格式校验不变。
|
||||
|
||||
## 7. SKU 首次上架(2026-09-30 实施修订)
|
||||
|
||||
底部提供「上架至 OZON」和「部分上架」。前者选择全部 `not_listed` / `failed` 活动 SKU,列出已导入或正在提交的跳过原因;后者由用户选择相同资格的 SKU。一次 1–50 个,超过时提示分批,不自动拆批。先保存草稿,再对相同选择集合预检,用户确认后创建任务。
|
||||
@@ -315,6 +333,8 @@ Headers:`X-Atlas-Platform-Id`、`Idempotency-Key`、`If-Match: "product_revisi
|
||||
|
||||
每个数组项表示一个标签,必须以单个 `#` 开头,正文只允许 Unicode 字母、数字和下划线,标签内不得包含空格或其他 `#`;每项最多 30 个字符(含 `#`)。Web 对手工输入显示具体格式提示,草稿仍可保存供后续修改;发布预检及创建任务按所选 SKU 的有效标签(SKU 覆盖或 SPU 继承)检查,不合规时返回 `OZON_HASHTAG_INVALID` 字段问题并阻止发布。未被选中或被 SKU 覆盖的通用标签不阻断当前发布。AI 全局填报和单 SKU 文案提示词采用同一格式要求;输出回填前补齐缺失的 `#`,将词间空白、连字符转为下划线,过滤仍含非法字符、重复或超长的标签,并保留对应中文对照。不自动改写手工及历史草稿标签。
|
||||
|
||||
产品描述/简介的编辑、草稿及发布快照保留纯文本中的内部换行和空行。Worker 生成 Ozon 请求时,仅将简介属性 `4191` 的 CRLF/CR 规范为 LF 并转换成 `<br>`,连续换行转换成连续 `<br>`;文本中的 `&`、`<`、`>` 转义为实体,避免被当成 HTML 标签。其他属性不转换,快照不被修改。简介换行标签依据 [Ozon 官方商品描述规范](https://global-help.ozon.com/zh/products/requirements/product-info/product-description)。Web 通用/SKU 描述及文案预览的复制入口直接复制原始纯文本,保留换行和空行,不复制上报用的 HTML;SKU 空描述复制其有效的 SPU 继承文本。此修复影响后续提交,不自动更新已导入的 Ozon 商品。
|
||||
|
||||
```json
|
||||
{ "data": { "publish_job": { "id": "uuid", "profile_id": "uuid", "store_id": "uuid", "status": "queued", "item_count": 2, "created_at": "ISO8601", "completed_at": null, "items": [] } } }
|
||||
```
|
||||
|
||||
@@ -22,6 +22,8 @@ Headers:`Idempotency-Key` 必填。
|
||||
}
|
||||
```
|
||||
|
||||
`purpose=product_image` 时必须传当前商品 UUID `product_id`,商品须属于当前工作空间;水印上传不传该字段。上传归属保存在上传意图中,完成上传沿用归属。
|
||||
|
||||
允许 `image/png`、`image/jpeg`、`image/webp`。`watermark_image` 最大 5 MiB、宽高 1–8192 px;`product_image` 最大 20 MiB、宽高 1–10000 px。服务端按用途校验大小/尺寸策略,生成随机 `object_key` 和 10 分钟有效的预签名上传地址。返回 `201 Created`:
|
||||
|
||||
```json
|
||||
@@ -40,6 +42,8 @@ Headers:`Idempotency-Key` 必填。
|
||||
|
||||
前端必须以服务器返回的 method、URL 与 headers 上传,不能自行拼接对象路径;上传 URL 仅可写入该次目标对象。
|
||||
|
||||
对象存储的跨域规则必须允许实际 Web Origin 发起 `PUT`,并允许 `content-type` 请求头;使用 Fetch 读取签名图片时还需允许 `GET`/`HEAD`。预检 `OPTIONS` 由存储服务处理,不能通过设置 `no-cors` 绕过。七牛 S3 空间未配置 CORS 时预检返回 403 `CORS is not enabled for this bucket`,浏览器直传会抛出 `Failed to fetch`,尚未进入完成校验。开发空间当前规则 `atlas-local-web-upload` 允许 `http://localhost:8100`、`http://127.0.0.1:8100` 的 PUT/GET/HEAD 和 content-type,预检缓存 600 秒;部署其他域名或新建空间时需单独配置对应 Origin。
|
||||
|
||||
### 1.2 完成与校验上传
|
||||
|
||||
`POST /api/media/upload-intents/{upload_id}/complete`
|
||||
@@ -79,13 +83,13 @@ Headers:`Idempotency-Key` 必填。
|
||||
|
||||
`purpose` 可为 `preview` 或 `download`。下载时传 `{ "purpose": "download" }`,服务端在签名 GET 请求中指定 `Content-Disposition: attachment`,文件名为 `atlas-image-{asset_id}` 加素材类型对应扩展名,浏览器打开该短时地址时保存文件。两种用途都返回 10 分钟有效的 `url` 与 `expires_at`。仅当前工作空间的素材可签发;前端在 URL 过期后重新请求,不能把 URL 写回业务表或长期缓存。
|
||||
|
||||
`GET /api/media-assets/product-uploads` 返回当前工作空间最近 100 个已经完成校验的 `product_image` 素材。每项包含 `MediaAsset` 字段及 10 分钟有效的 `preview_url`、`preview_url_expires_at`,供编辑页“上传图片”候选区展示;该地址不得写入草稿。
|
||||
`GET /api/media-assets/product-uploads?product_id={product_id}` 必须指定当前商品,返回该商品最近 100 个已经完成校验的 `product_image` 素材。每项包含 `MediaAsset` 字段及 10 分钟有效的 `preview_url`、`preview_url_expires_at`,供编辑页“上传图片”候选区展示;该地址不得写入草稿。
|
||||
|
||||
### 1.4 网络商品图片导入
|
||||
|
||||
`POST /api/media-assets/product-imports`,需 `Idempotency-Key`,请求 `{ "url": "https://example.com/image.jpg" }`。只接受 HTTPS、无用户信息和自定义端口、路径以 `.jpg`、`.jpeg` 或 `.png` 结尾的链接。服务端在每次重定向时解析域名并把连接固定到已检查的公网 IPv4;最多跟随 3 次重定向,下载上限 5 MiB,校验文件内容、MIME 与最大边长 10,000 px。成功返回 `201`,`data` 为 `ProductImportedImage`:`MediaAsset` 字段、原始 `source_url`、10 分钟有效的 `preview_url` 和 `preview_url_expires_at`。重复 URL 更新当前候选素材;原有 SKU 选图不被自动替换。
|
||||
`POST /api/media-assets/product-imports`,需 `Idempotency-Key`,请求 `{ "product_id": "当前商品 UUID", "url": "https://example.com/image.jpg" }`,商品须属于当前工作空间。只接受 HTTPS、无用户信息和自定义端口、路径以 `.jpg`、`.jpeg` 或 `.png` 结尾的链接。服务端在每次重定向时解析域名并把连接固定到已检查的公网 IPv4;最多跟随 3 次重定向,下载上限 5 MiB,校验文件内容、MIME 与最大边长 10,000 px。成功返回 `201`,`data` 为 `ProductImportedImage`:`MediaAsset` 字段、原始 `source_url`、10 分钟有效的 `preview_url` 和 `preview_url_expires_at`。同一商品重复 URL 更新当前候选素材;原有 SKU 选图不被自动替换。
|
||||
|
||||
`GET /api/media-assets/product-imports` 返回当前工作空间最近 100 条已导入的网络图片,响应项同上。图片已生成正式素材 ID 后才可进入 SKU 草稿;网络来源地址和预览地址均不得写入 `media_asset_ids`。
|
||||
`GET /api/media-assets/product-imports?product_id={product_id}` 必须指定当前商品,返回该商品最近 100 条已导入的网络图片,响应项同上。图片已生成正式素材 ID 后才可进入 SKU 草稿;网络来源地址和预览地址均不得写入 `media_asset_ids`。
|
||||
|
||||
### 1.5 商品图片一键 3:4
|
||||
|
||||
@@ -233,3 +237,14 @@ Headers:`Idempotency-Key` 必填;请求体为 `{}`。将当前工作空间
|
||||
单张和批量处理逐张创建任务。成功结果在图片弹窗中替换对应位置;来源候选图成功后加入已选区,失败图保持原样。弹窗可撤销本次水印替换;确认后才写入当前编辑表单,页面保存后持久化 SKU 选图。上架任务不会临时加水印。
|
||||
|
||||
`GET /api/products/{product_id}/image-derivatives` 返回当前工作空间内该商品最近 100 条成功的 3:4 与水印处理记录,按处理时间倒序;商品不存在返回 `404`。每条记录包含 `id`、`kind`(`aspect_ratio_3_4` / `watermark`)、`source_asset_id`、`created_at` 和带短时预览地址的 `output_asset`。编辑页选图弹窗的「图片处理记录」Tab 用它找回结果,选用后仍需确认选图并保存页面。未绑定商品的历史任务无法确定商品归属,不进入该列表;来源图与原素材不被覆盖。
|
||||
|
||||
商品图片候选库按商品隔离,同一商品的 SKU 可共用。上传/导入记录使用 `(workspace_id, product_id)` 外键约束商品归属;不同商品即使复用同一哈希素材,也必须各自上传或导入才能取得候选资格。历史无归属的记录不进入候选库,已有 SKU 选图仍可原样保存。
|
||||
|
||||
|
||||
### 商品图片删除
|
||||
|
||||
`POST /api/products/{product_id}/image-deletions` 需 Idempotency-Key。请求严格为 `{ "asset_id": "素材 UUID" }` 或 `{ "collection_image_id": "采集图片 UUID" }`。仅可删除当前工作空间、当前商品的上传/网络导入/AI/处理结果/采集候选。未物化的采集图仅移除 Atlas 候选;已有正式素材同时清理对象存储。返回 202,data 为 ProductImageDeletion(id/status/asset_id/collection_image_id/error_code/operation)。GET 同路径列出未完成清理记录,GET 同路径加 `/{deletion_id}` 读取状态;POST `/{deletion_id}/retry` 需 Idempotency-Key,重试失败清理。
|
||||
|
||||
已保存 SKU、头像/水印、其他商品候选或活跃图片任务引用时返回 409 `MEDIA_ASSET_IN_USE`,须先解除引用。删除事务锁定素材、标记不可选并记录清理对象及 Outbox;Worker 幂等清理七牛实际对象,成功后标记 succeeded,失败后 failed 可重试。未成功清理不得显示已删除成功。素材审计关系保留,删除后摘要释放,后续相同图片重新上传使用新素材和新对象路径。所有新引用由数据库触发器拒绝已删除素材。
|
||||
|
||||
删除资源携带统一 operation,可通过 GET /api/operations/{operation_id} 查询;operation 与业务资源/Outbox 同事务创建,重试和终态同步更新。
|
||||
|
||||
@@ -49,6 +49,7 @@ AI 不生成售价、采购价、品牌、条形码、图片、富内容、动
|
||||
- 当前通用保存契约仅有较宽的 `model ≤ 300`、`offer_id ≤ 500` 字符上限。上述 32/48 及连接符规则是**AI 生成值的强校验**,不应悄悄拒绝已有或手填的较长编号;如要统一收紧所有编号,需要先盘点历史值并单独迁移、通知用户。
|
||||
- `model` 是跨平台商品字段,也会映射到 Ozon「型号名称」属性。本期按用户希望使用可识别编码;后续若需要单独的内部编码与对外型号,应新增独立字段,不能在生成逻辑里偷偷分叉。
|
||||
- 已导入 SKU 的货号是历史事实;AI 结果绝不填入或改动。手填非空型号/货号按页面覆盖规则保留。
|
||||
- 2026-10-06 编辑器交互修订:货号前缀跟随商品型号,用户只编辑 SKU 后缀,保存请求仍传完整 `offer_id`。AI 返回的完整货号拆出其生成型号前缀后,按表单当前型号组合;用户已填后缀不被 AI 覆盖。手工修改型号会同步未导入 SKU 的前缀并保留后缀,已导入/进行中货号保持历史值。后缀空白时完整货号仍为空;完整货号沿用当前保存与发布的 50 字符上限。
|
||||
|
||||
### 4.3 包装重量与尺寸
|
||||
|
||||
@@ -70,6 +71,8 @@ AI 不生成售价、采购价、品牌、条形码、图片、富内容、动
|
||||
|
||||
全局结果包含 `category` 或 `category_candidates`、`model`、`offers`、可选 `package_spec`、`spu_copy`、`warnings`。单 SKU 结果只包含 `variant_id`、`copy`、`warnings`。任务输入固化商品、profile、来源快照版本和 SKU ID;前端在回填前再次比对版本。
|
||||
|
||||
2026-10-06 单 SKU 文案弹窗增加「用户描述 / 生成要求」,最多 1000 字符,通过既有 `hint` 固化到当前任务。用户补充的描述、商品事实修正和写作要求高于采集资料、旧 SKU 信息及已有文案;冲突时采用用户明确修正,其他信息仅作补充。输出仍须满足俄文发布、中俄对照、JSON 与标签格式约束。弹窗先展示要求输入,采集资料放入可展开的辅助参考区;修改要求后旧结果失效,生成完成后由用户应用到当前 SKU 草稿。要求按 SKU 暂存于页面内,不写回商品采集字段。
|
||||
|
||||
接口结构示意(实际契约见 `@atlas/contracts`):
|
||||
|
||||
```json
|
||||
|
||||
@@ -698,3 +698,128 @@ User → Workspace → Membership / Role
|
||||
- [M2.2 / M2.3 扩展采集交接](./m2.2-m2.3-extension-collection.md)
|
||||
- [M2.4 来源解析与测试页交接](./m2.4-source-parsers-and-inspection.md)
|
||||
- [技术栈、异步任务与部署方案](../architecture/technology-and-deployment.md)
|
||||
|
||||
### 2026-10-05 采集页面地址回填货源链接
|
||||
|
||||
当前集成会话修改 API `extension.service.ts` 新采集商品写入、`product-editor.service.ts`/models 编辑读模型、extension HTTP 集成回归以及 API/交接文档。插件既有解析器已上报 `source.canonicalUrl`,问题是地址只保存于采集记录,未用于商品货源字段。新建商品同时初始化 `purchase_url`;编辑读模型优先使用手工非空链接,空值回退关联采集记录 `source_url`,历史商品无需复采,手动无来源商品仍为空。清空表示恢复来源地址,复采不覆盖手工非空链接。不修改插件、HTTP 字段或数据库,无历史草稿批量写入。
|
||||
|
||||
采集授权/素材 HTTP 2 项与商品编辑 13 项通过,覆盖新 1688 地址初始化、历史空字段回填、Ozon 地址、复采保留手工链接和既有商品编辑边界;API 源码/测试类型检查与构建、Web 类型检查/构建及差异检查通过。在用户当前商品的独立浏览器验证页确认 1688 来源地址已显示、打开按钮启用,输入框与按钮均 35px 且对齐。原用户页面未重载或保存,避免丢失编辑;API 开发进程自动重载,无手动启停。未向真实平台发布,未重新采集或写入真实商品。
|
||||
|
||||
## 2026-10-05:Pcore 同源图片接口与开发代理 DNS 兼容
|
||||
|
||||
- 最新单张任务在 Pcore 为 `completed`,结果域名 `pcore.ai` 被系统 DNS 解析为 `198.18.1.69`,原通用公网图片下载校验因此拒绝。修复范围是 Worker 的单张/套图共用取图链路及内部安全说明;不新增 HTTP 字段、数据库迁移或前端行为。
|
||||
- 对与 `PCORE_BASE_URL` 同源且严格匹配已保存任务 `/v1/images/content/{provider_task_id}/0` 的结果,从服务端配置与任务 ID 重建取图请求,保留 TLS 校验、禁止重定向、无 API Key、25 MiB 上限;其他地址继续执行原公网 DNS 与固定 IPv4 校验。没有全局放行 Fake-IP 或内网地址。
|
||||
- 同源接口下载沿用 60 秒无数据超时,并增加 5 分钟总上限;持续传输的慢速图片不再被固定 60 秒总超时中断。连接和下载超时归为 Pcore 取图失败,诊断信息不记录供应商 URL 或密钥。
|
||||
- Worker 定向测试 10 项、类型检查、构建与差异检查通过,覆盖任务路径绑定、错误地址拒绝、重定向拒绝、声明/流式大小限制、base64/URL 两种完成结果和不重新提交生图。维护者的 Worker `tsx watch` 已自动加载修改,没有手动重启 API/Worker,也没有启动前端验证服务。
|
||||
- 使用修复后的真实下载函数成功读取最新任务的 PNG:2,038,121 字节、1152×1536,耗时 201 秒。仅对本次单张失败任务保留原供应商 ID,在工作空间事务内重排任务与 Outbox,以恢复取图和保存;没有提交新的收费生图任务,没有改写 SKU 选图,也没有批量重试其他历史任务。
|
||||
- 恢复任务 `30f32836-706d-45a9-a301-f536305dd7a9` 已由维护者现有 Worker 处理为 `succeeded`,正式结果素材已登记;operation 失败诊断已随成功回写清除,可通过原任务或当前商品 AI 生图记录查看结果。
|
||||
|
||||
## 2026-10-05 已上架 SKU 本地价格重新试算
|
||||
|
||||
本轮跨 Web `SkuPricing`、定价 API、商品编辑读模型、共享契约与接口/交接文档。已上架 SKU 开放「重新试算」和「试算详情」,应用价格前确认:「该 SKU 已上架。本次价格调整仅保存为本地记录,不会同步至 Ozon;如需修改线上价格,请前往 Ozon 后台。」取消不修改价格,确认后更新草稿,仍须保存商品。批量计算和自动试算继续跳过已导入项。
|
||||
|
||||
编辑快照新增 `variants[].listing.store_id`。已上架 SKU 固定读取首次导入店铺的定价目录和币种,即使 profile 的将来目标店铺已变更。API 允许此 SKU 生成预览,跨店铺试算返回 `PRICING_VARIANT_STORE_MISMATCH`;显式 `pricing_selection` 按已有有效期、输入、规则和幂等边界确认新本地报价,普通草稿保存保留原报价。保持首次导入状态、店铺、货号、平台商品 ID 和导入时间,不创建发布或价格同步任务,无数据库迁移、Worker 或扩展业务改动。
|
||||
|
||||
定价保存 13 项、首次发布 11 项、商品编辑 13 项和采集 2 项集成测试通过,覆盖已上架新报价、错误店铺拦截、失效报价原子回滚、幂等重放、普通保存保留报价及零平台任务。Contracts/API/Web/Worker 类型检查与构建通过;Web 存在原有大包体警告。ego-browser 隔离真实组件验证两个入口均可用,取消不改变草稿,确认后实际售价 120 / 划线价 240,始终使用首次导入店铺,批量不自动改价。临时页面与代理浏览器已清理;未保存真实商品或操作 Ozon,没有手动启停维护者服务。
|
||||
|
||||
## 2026-10-05 采集插件编辑上架进入商品编辑器
|
||||
|
||||
修改扩展 `collector.content.ts`、API `extension.service.ts`、Web 编辑页及 `productEditor` 服务和 API/交接文档。根因是采集响应仍提供测试页路径,且新商品尚未初始化平台编辑配置。采集成功响应改为 `/products/{product_id}/editor?collection_item_id={collection_item_id}`,扩展继续使用响应入口并提示「已打开商品编辑页」。Web 携带采集 ID 调用现有 `editor-contexts`,核对商品 ID 后读取快照;当前页头平台和默认店铺规则沿用既有契约。重复采集进入原商品,既有上下文保留资料和上架状态;「采集商品」仍不打开编辑页,没有自动上架、媒体下载或平台绑定写入采集事务。测试页和旧手工商品入口保留,无新增 HTTP 字段或数据库迁移。
|
||||
|
||||
API 采集/商品编辑集成回归 15 项通过,覆盖新入口实际商品 ID、幂等重放、复采路径稳定以及首次上下文初始化。API 源码/测试类型检查与构建、Web 类型检查/构建、扩展 WXT prepare/类型检查/Chrome MV3 构建通过;Web 原有包体大小警告保留。ego-browser 隔离真实前端服务验证首次入口先初始化后读快照,普通既有入口直接读取,商品不匹配及无默认店铺阻断读取,并沿用当前平台。临时页面和任务浏览器已清理,没有采集/保存真实商品或调用 Ozon,未手动启停维护者服务。扩展新产物位于 `apps/extension/.output/chrome-mv3`,已加载静态扩展的浏览器需重载扩展并刷新来源页以更新成功提示;既有插件已使用响应入口,API 更新即可更改下一次跳转地址。
|
||||
|
||||
## 2026-10-05 采集插件最小化入口
|
||||
|
||||
本轮仅调整扩展 `collector.content.ts`、新增展示模块 `lib/collector-panel.ts` 及扩展交接文档。原 9px 黄点点击后删除整个浮窗,改为 32px 横线最小化按钮;最小化隐藏面板、显示 48px 圆形「A」,点击或键盘操作可恢复,焦点移至当前可见入口。保留同页折叠状态及最小化前的采集提示,登录态/来源 URL 刷新展示时继续沿用折叠状态。没有 HTTP、登录、采集、编辑跳转或数据库变更。
|
||||
|
||||
扩展类型检查和 Chrome MV3 构建通过。ego-browser 隔离真实 Shadow DOM 展示模块验证已登录/未登录面板、按钮 32×32px 与图标 18×18px、圆形 A 48×48px、展开/折叠、提示保留、页面更新保持折叠、键盘操作及 1280/390px 布局,最小化/恢复不额外触发采集动作。截图工具超时,外观尺寸和状态以实际 DOM/CSS 测量验证;临时预览及任务浏览器已清理。新产物在 `apps/extension/.output/chrome-mv3`,静态加载需重载扩展并刷新来源页;未手动启停现有服务。
|
||||
|
||||
## 2026-10-05 采集参数错误诊断与后台消息传递
|
||||
|
||||
用户报告 1688 商品 616913767097 点击编辑上架出现「Uncaught Error: 请求参数不符合要求」。浏览器安全策略明确拒绝直接读取该来源页,未改用其他浏览器、网络或间接手段获取页面。现有本地 1688 样本完整载荷通过共享校验,尚未获得该商品的失败字段明细,不能声称实际参数根因已解决。已请用户重载扩展并复制新版浮窗的完整字段提示,下一轮据此处理。
|
||||
|
||||
本轮仅修改扩展后台、API 客户端和内容脚本消息处理,新增 `collection-payload-validation.ts` 与 `request-errors.ts`。后台失败返回可序列化错误,内容脚本解包后由现有 try/catch 显示;保留服务端 error.details 最多三项字段原因,提交前按共享载荷契约校验,不静默截断真实 SKU 或放宽服务端约束。提示支持长字段换行,不展示请求、令牌或授权头。HTTP/共享契约、服务端、数据库和来源解析规则无改动;校验库仅进入后台包,不增加页面内容脚本依赖体积。
|
||||
|
||||
扩展解析与诊断回归 13 项、类型检查、Chrome MV3 构建和差异检查通过。ego-browser 隔离真实后台与浮窗验证模拟 422 明细能显示字段名和原因,无未处理 Promise 异常、不打开编辑页;这里的模拟字段不代表用户商品的实际问题。临时页面与任务浏览器已清理。既有开发服务未手动启停,新静态产物需重载扩展并刷新来源页。
|
||||
|
||||
## 2026-10-06 采集与编辑保存支持超过 100 个 SKU
|
||||
|
||||
用户补充的明确字段错误为 `variants: Too big: expected array to have <=100 items`,关闭上一轮待定位事项:根因是插件与 API 共享的采集数组上限为 100,且编辑完整草稿也有独立的 100 项上限,真实 1688 组合超过此值即失败。当前集成会话修改共享契约、API 采集响应统计、扩展/API 回归与 API/交接文档。新增 `PRODUCT_VARIANT_LIMIT=1000`,采集和商品完整保存统一使用;超限中文提示,不静默截断 SKU。采集响应的 `variant_count` 改为实际未删除 SKU 数。首次发布每批 50 个、媒体数量、其他字段约束、工作空间采集商品配额及 Ozon 公开页有界补全规则均保持原边界,无数据库迁移或 Worker/Web 业务逻辑修改。
|
||||
|
||||
扩展回归 15 项通过,验证 1688 200 条明确可售记录完整解析、101/1000 条接受、1001 条拒绝和上架 50/51 条边界。API 采集/商品编辑 16 项通过,新增完整 1000 SKU 的采集入库、编辑初始化、读取末尾 SKU、完整草稿保存、复采保留 ID 与人工修改、超限请求不改变来源版本或 SKU 数;测试数据隔离,无真实采集或 Ozon 发布。Contracts/API(含测试)/Web/Worker/Extension 类型检查和构建通过;Web 原有包体警告保留,差异检查通过。维护者现有 API 开发进程随源码自动重载,未手动启停服务;插件静态产物已重建,需重载扩展并刷新来源页后再次采集。
|
||||
|
||||
## 2026-10-06 SKU 数量误采与旧开发包校验
|
||||
|
||||
用户反馈页面不足 100 个 SKU,却继续报旧 `<=100` 校验。纠正上轮只凭校验错误认定页面 SKU 超过 100 的判断:错误代表解析载荷数量,不能代替实际页面数量。检查本地产物确认正式包已更新而 `chrome-mv3-dev/background.js` 仍包含旧 100 上限;同时本地合成脚本复现仅 2 个真实 SKU、前置字段名字符串加 150 个元数据对象被旧解析器当成 150 SKU 的问题。浏览器安全策略仍禁止直接读取该来源页,本轮没有换浏览器或间接获取源页;此复现证明代码缺陷,不声称已核验真实页面的具体 SKU 数。
|
||||
|
||||
仅修改扩展解析器、构建配置、浮窗提示、回归和交接文档。脚本回退只识别对象属性后直接的对象/数组字面值,不再从字符串引用、null 跳到后续无关对象;优先使用同一 skuModel 的规格与 SKU 表。表内无来源 ID 的记录须具备完整规格匹配和可售证据,元数据不生成 SKU;真实无 ID 组合、零库存组合及大于 100 的真实表仍保留。WXT 构建添加共享契约源码 alias,正式包直接读取源码,避免旧 dist 依赖;修改触发既有开发服务重建,已核对开发/正式包均包含新上限和新解析数量提示。浮窗在提交和成功时显示本次解析 SKU 数量。保留已批准的 1000 容量,不继续提高限制。
|
||||
|
||||
扩展回归 18 项、类型检查、正式构建及差异检查通过,覆盖误采 150→2、null 字段回退、元数据排除、无 ID 明确组合保留、原始 16 SKU 样本和真实 200 SKU 表。既有 8110 开发服务自行重建,未手动重启 API/Worker/Web 或关闭浏览器。开发包旧 100 校验已消失,正式包和开发包均有新数量提示;用户需刷新来源页更新已有内容脚本。没有真实采集、商品保存或平台发布。
|
||||
|
||||
## 2026-10-06 1688 CSS 背景画廊与视频补采
|
||||
|
||||
用户提供商品 1012823100668 的画廊 HTML:主图位于 `.od-picture-gallery-list` 缩略项 CSS background-image,包含视频封面、15 张独立照片和参数图标。旧规则要求特定外层容器且过滤 200px 以下缩略项,造成主图漏采。本轮仅修改扩展 `product-media.ts`、`source-parsers.ts`,新增用户 HTML 样本与 4 项回归,并更新交接文档,无 HTTP 字段、API、数据库、Worker 或 Web 业务变更。主图按明确画廊位置读取背景地址、还原原图、保留顺序并去重;排除视频控件、参数图标和 undefined 占位地址,视频封面的重复照片仍可作为主图。
|
||||
|
||||
视频读取仅限商品画廊播放器的 currentSrc/src/source,或明确 gallery 字面值中的公开视频字段;支持 HTTPS MP4/WebM,与结构化候选去重并补充封面,不读取画廊外推荐视频、blob 或 HLS,也不从 JPG 猜测视频地址。用户片段只有视频封面,尚未提供实际播放器或公开视频地址,已提出补充请求;因此仅能确认视频读取路径已补齐,不能声称此商品实际视频已成功采集。来源域曾被浏览器安全策略禁止直接读取,本轮只使用用户 HTML 和离线合成视频,没有通过其他工具访问实际来源页。
|
||||
|
||||
扩展 22 项测试、类型检查、正式 Chrome MV3 构建通过。ego-browser 本地真实 DOM 回归确认 60px 缩略图仍得到 15 张原图、无参数/undefined 候选,封面不会伪造视频,挂载合成画廊播放器后得到 1 个视频。浏览器阻止所有 HTTPS 请求,不下载远程媒体;临时 QA 页面与 TaskSpace 7 已清理。维护者既有服务未手动启停。静态扩展需重载扩展并刷新来源页后重新采集,开发包需确认自动更新内容脚本;没有真实商品入库、保存或 Ozon 发布。
|
||||
|
||||
## 2026-10-06 SKU 货号自动型号前缀
|
||||
|
||||
维护者要求 SKU 货号固定以型号为前缀、用户只输入商品后缀。修改范围仅 Web `ProductEditPage`、`SkuInfoPanel`、`ProductVariantSection` 及 CSS,新增 `skuOfferId.ts` 与 `SkuOfferIdInput.tsx`,同步 API/AI/决策与 Web 交接文档。型号修改同步全部未导入 SKU 的完整货号并保留后缀,收起项从完整表单读取,不丢其他 SKU 字段;清空型号保留后缀,空后缀不生成只有前缀的货号。旧自定义货号完整保留为后缀,补前缀只进入待保存草稿。AI 返回货号先拆生成型号前缀再按表单型号组合,不覆盖用户非空后缀。导入/进行中货号只读且保持原值;型号已有锁定规则继续生效。完整货号沿用 50 字符限制,超限有明确保存提示,不截断旧后缀。接口仍提交完整 offer_id,无 API/共享类型、数据库、Worker 或扩展代码变更。
|
||||
|
||||
Web 类型检查/生产构建与差异检查通过,保留原有包体大小警告。ego-browser TaskSpace 8 本地真实组件/表单验证展开和收起 SKU、连续型号变更和清空、后缀清空、旧货号保留、采购价/图片资料保留、导入货号只读、输入整串 50 字符上限、型号变长时后缀不截断以及 390/1280px 布局。临时验证文件与代理浏览器已清理,未读写真实商品、调用 Ozon 或手动启停现有服务。
|
||||
|
||||
## 2026-10-06 SKU 文案用户要求优先与弹窗重设计
|
||||
|
||||
维护者要求当前 SKU 文案生成可输入用户描述/要求,并优先于采集商品信息。本轮跨 Web 弹窗、编辑页和请求客户端,Worker 文案提示词,共享契约(导出既有 1000 字符限制与请求类型),新增 API 单元回归、Worker 回归及 API/AI/Web 文档。沿用既有 `hint`,服务端已固化到 AI 任务输入与幂等摘要,无 HTTP 字段/校验规则变更、数据库迁移或扩展改动。Worker 单独传用户要求,系统提示明确优先于采集资料、旧 SKU 信息和已有文案;仍遵守俄文、JSON、中俄对照及主题标签输出契约,当前 SKU 摘要不携带其他 SKU 专属信息。
|
||||
|
||||
弹窗主要输入展示用户要求(最多 1000 字符),采集资料折叠为辅助参考,结果分字段展示中俄文;要求按 SKU 暂存页面内,不改写采集资料。修改要求使旧预览失效,需重新生成才能应用。生成时禁用输入,关闭/切换后异步旧结果由请求序号隔离;结果 SKU 和来源/商品/profile 版本需匹配。应用当前标题时若从通用切换逐 SKU,其他 SKU 原先继承的标题及中文对照保留,不被清空。
|
||||
|
||||
Contracts/API(源码及测试)/Worker/Web 类型检查和构建通过,API 2 项单元测试与 Worker 12 项文案测试通过。ego-browser TaskSpace 9 在真实 ProductEditPage 配合模拟接口验证输入传递、结果失效、按 SKU 要求保留、关闭后旧任务隔离、当前 SKU 应用/模拟保存、其他 SKU 通用标题和对照保留、空要求、1000 字符边界及桌面/390px 弹窗无横向溢出;底层编辑页原有窄屏溢出保留为既有布局问题。临时 QA 文件与代理浏览器已清理,没有读写真实商品、调用收费 AI 或 Ozon,未手动启停现有服务。Web 原有大包体警告保留。
|
||||
|
||||
|
||||
## 2026-10-06 商品上传与网络图片归属隔离
|
||||
|
||||
维护者要求 SKU 选图中的上传图片、网络图片绑定当前商品。根因是候选列表和保存资格均按工作空间读取,以及前端切换商品后保留候选缓存。本轮跨 Web 图片客户端/选图 Hook/套图参考图/商品变体上传入口、API 媒体控制器与服务/编辑器保存校验、共享素材契约、数据库迁移 060 和相关契约/测试文档。商品上传意图与网络导入请求必须传 product_id;候选 GET 必须带 product_id 查询参数。水印上传继续不传商品;上传完成沿用意图归属。同商品 SKU 共用候选,跨商品需各自主动上传或导入才能绑定相同哈希素材。数据库复合外键确保归属与工作空间一致,网络来源 URL 唯一性改为工作空间+商品+URL,原有 RLS 继续强制隔离。保存 SKU 同步按商品校验资格。
|
||||
|
||||
历史上传/导入记录没有可信商品归属,保留空归属但退出全局候选;已有 SKU 当前选图可继续原样保存。前端切换商品清空候选和文件指纹,并用商品世代号隔离延迟上传、导入和列表响应;直接上传到 SKU 的结果由编辑会话隔离。没有自动改写历史 SKU 选图。
|
||||
|
||||
迁移 060 已在本地应用并重复执行验证;Contracts/API(源码及测试)/Database/Web 类型检查和构建通过。服务端 28 项相关单元/数据库/HTTP 测试验证归属、重复素材独立绑定、幂等、FK/RLS、无商品参数拒绝及 SKU 保存。ego-browser TaskSpace 10 用真实候选 Hook 和模拟接口验证跨商品无混图、同商品 SKU 共用、旧请求隔离、相同文件在不同商品可重新上传、加载期间无旧候选,临时 QA 文件和浏览器已清理。未手动启停维护者服务;API 8200 自动热重载,Web 8100 继续运行,未调用收费 AI 或 Ozon、未修改真实商品。Web 保留原有包体大小警告。
|
||||
|
||||
|
||||
## 2026-10-06 SKU 名称与货号恢复同行
|
||||
|
||||
修复型号前缀控件引入时将货号设置为整行的布局回归。Web `SkuInfoPanel` 将名称与货号放入独立两列基础资料行,`ProductVariantSection.css` 调整行布局和长型号前缀截断宽度;即使其余发布字段在窄容器中切为单列,基础资料仍保持同行。型号前缀、后缀编辑、完整货号与锁定规则不变,无 API/共享契约/数据库变更。Web 类型检查、生产构建和差异检查通过;ego-browser TaskSpace 11 验证 1280/620/390px 名称和货号输入同行、不溢出,并确认后缀修改仍组成完整货号。临时 QA 文件和浏览器已清理,未手动启停服务或修改真实商品,保留既有包体警告。
|
||||
|
||||
|
||||
## 2026-10-06 七牛直传 Failed to fetch 排查与修复
|
||||
|
||||
用户报告 SKU 图片上传失败 Failed to fetch。前端使用上传意图返回的 S3 预签名地址直接 PUT;只读排查确认当前七牛开发空间 atlas-dev-assets 无 CORS 配置,OPTIONS 返回 403 AccessForbidden / CORS is not enabled for this bucket,无 Access-Control-Allow-Origin。已通过 S3 API 配置 atlas-local-web-upload,仅允许本地 Web Origin http://localhost:8100 与 http://127.0.0.1:8100,方法 PUT/GET/HEAD、请求头 content-type、MaxAge 600 秒;读取现有规则后保留其他规则(本次原为空)。此次修复为开发空间配置与上传契约文档更新,无业务代码/API 字段/迁移变更。
|
||||
|
||||
修复后真实预检返回 200 并允许本地 Origin;ego-browser TaskSpace 12 在本地页面通过真实七牛预签名 PUT 上传临时 PNG,浏览器返回 200,HEAD 确认内容类型 image/png 与长度一致,验证对象已立即删除。临时 QA 页面与代理浏览器已清理,未修改真实商品和用户图片,未手动启停服务。新建空间或切换 Web 域名时必须重新配置对应 Origin;前端不能用 no-cors 绕过。
|
||||
|
||||
|
||||
## 2026-10-06 SKU 候选图片删除与七牛清理
|
||||
|
||||
维护者要求右侧候选图片「编辑」菜单底部提供删除、二次确认并同步删除七牛文件。本轮跨 Web 选图弹窗/商品变体草稿、API 媒体与相关素材读取、Worker 存储清理、共享契约和数据库迁移 061/062。新增商品范围的删除、待处理列表、状态读取与失败重试接口,详见 `docs/api/watermarks-and-assets.md`。左侧「移出已选」仍仅调整选图;右侧删除确认后移除候选及未保存选图,异步清理完成才提示存储文件已删除。失败保留数据库任务,弹窗显示重试入口。
|
||||
|
||||
API 锁定素材、校验商品归属与全部使用引用;已保存 SKU、头像、水印、其他商品候选或活跃图片任务引用返回 409,须先移除引用并保存。未转存采集候选只取消本商品候选,已有存储素材标记删除并释放哈希去重,保留历史审计。删除记录、operation 与 Outbox 同事务登记;Worker 幂等删除素材及去重上传的存储对象,完成后回写成功,重试耗尽回写失败。新对象路径增加随机标识,避免重新上传同图与待删除旧对象冲突;兼容当前七牛和既有 local_minio 存储。数据库新增引用触发器禁止引用已删除素材,删除触发器保护已使用素材,保持工作空间 RLS 与复合外键。
|
||||
|
||||
迁移 061/062 已在本地应用;Contracts/API(含测试)/Database/Worker/Web 类型检查与构建通过。相关 API 单元/数据库/HTTP 回归 47 项及迁移 062 引用保护的定向回归通过,Worker 媒体/发布回归 26 项通过,差异检查通过。使用隔离临时商品和真实七牛 PNG 验证现有 Worker 完成清理,HEAD 返回 404,测试对象和数据库记录已清理。ego-browser TaskSpace 13 使用真实弹窗和模拟接口验证删除菜单顺序、确认前不提交、取消保留图片、引用拒绝、失败不报成功及重试恢复;临时 QA 页面和任务浏览器已清理。没有删除真实用户图片、保存真实商品或调用 Ozon;没有手动启停维护者服务,API/Worker 自动重载,Web 8100 继续运行。Web 保留原有包体大小警告。
|
||||
|
||||
|
||||
## 2026-10-06 SKU 商品颜色回显与多选提交
|
||||
|
||||
维护者报告保存草稿后首个颜色显示字典编号,以及多颜色上架被单值校验拦截。本轮跨 Web 动态属性控件、API 草稿保存/发布映射、共享商品属性规则、发布回归与 API 文档。商品颜色统一按 Ozon 属性 ID 10096 识别,最多 100 个有效字典值;颜色编辑、保存和发布共用数量规则,覆盖目录中的单值标记,其他属性沿用自身 schema。草稿保存多个字典 ID,发布逐项映射 ID 与文本,不拼接或截断。此前草稿多选按中文名称识别、发布仍直接校验 max_value_count,导致规则不一致;此次去除数量规则对名称语言的依赖。
|
||||
|
||||
Web 初始化主动加载颜色字典,独立保留当前属性的已选名称,搜索或保存回填更换候选页后已选标签仍显示文本;字典尚未加载时采用既有 Ozon 颜色 ID 对应的俄文名称兜底,未知值显示名称待加载而不展示编号,不改变实际提交值。类目属性 UUID 变化后不复用旧名称缓存。无数据库迁移、Worker 或扩展业务改动。
|
||||
|
||||
Contracts/API(含测试)/Web 类型检查和构建通过;API 商品编辑与发布 HTTP/数据库回归 25 项通过,新增双颜色保存/重读/发布快照、俄文属性名称、错误字典值拒绝与其他属性单值数量校验。ego-browser TaskSpace 14 使用真实 Form.List 内颜色控件和模拟字典验证加载前文本兜底、保存回填首个标签、搜索切换保留名称、重新展开、三色多选字典 ID 以及类目缓存隔离;临时 QA 文件和浏览器已清理。未修改真实用户商品或向 Ozon 发布,未手动启停维护者服务,Web 原有包体大小警告保留。
|
||||
|
||||
|
||||
## 2026-10-06 产品描述上报与复制保留换行
|
||||
|
||||
维护者要求简介/产品描述上报和复制保留换行。本轮修改 Worker 发布请求适配,新增 ozon-description.ts;Web 新增 CopyTextButton 并接入通用描述、SKU 描述、中俄对照和 SKU AI 结果预览;同步 API 契约说明与发布集成回归,无 API 字段、数据库迁移或草稿存储格式变更。Ozon 官方商品描述规范明确简介支持 br 换行标签。Worker 仅在提交边界将属性 4191 的纯文本 CRLF/CR/LF 转为 br,空行保留连续 br,&/< /> 转义为实体;不修改持久化发布快照或其他属性。编辑与剪贴板继续使用含换行的原文,SKU 空白描述复制有效 SPU 继承值。修复只影响后续提交,不自动更新已导入商品。
|
||||
|
||||
API 源码/测试、Worker 和 Web 类型检查及构建通过;13 项发布 HTTP/数据库/Worker 模拟回归通过,新增 SKU 覆盖、SPU 继承、空行/特殊字符、实际请求内容和快照不可变验证。ego-browser TaskSpace 16 先核对官方规则,再使用真实组件和模拟剪贴板验证通用/SKU/继承描述以及中俄对照、AI 结果复制内容逐字一致,显示使用 pre-wrap;临时 QA 页面和浏览器已清理。没有修改真实商品、调用收费 AI 或向 Ozon 发布,没有手动启停维护者服务,Web 原有包体警告保留。
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
2. 扩展以同步到的 Web Bearer token 调用会话检查和采集接口;服务端同时验证 JWT 与未撤销的 Web session,并从当前用户成员关系解析工作空间。Token 失效时插件清除缓存并重新要求从 Atlas Web 登录同步。
|
||||
3. 扩展上报仅携带来源、规范化 SKU/规格轴、候选素材 URL 和证据;`POST /api/extension/materials` 从 Web Bearer 身份解析工作空间,不接受目标平台、门店、Cookie 或 API Key。非 Ozon 来源按 item key 复用;Ozon 额外按已确认 `source_sku` 集合相交复用同一采集记录。
|
||||
4. 上报事务创建来源采集记录、SPU、来源确认 SKU 和媒体候选(`pending_selection`);同一来源商品再次采集时保留记录与商品 ID,并用本次来源快照替换来源字段、SKU 与候选素材。采集本身不下载媒体也不写素材 Outbox。编辑流程选中候选后,`POST /api/collection-items/{id}/asset-materializations` 才将指定候选置为 `queued` 并经 Transactional Outbox 进入 Worker;任务带快照版本,Worker 仅处理当前版本,旧任务不得回写。Worker 仅下载 HTTPS 公网地址,限制重定向、私网地址;图片限制 20MB 和 PNG/JPEG/WebP,视频限制 200MB 和 MP4/WebM,均按 SHA-256 去重后写入对象存储。单张失败不会使商品草稿丢失。
|
||||
5. Ozon (`ru/kz/by`) 商品详情页显示 Shadow DOM 小浮窗。未登录只显示“登录 Atlas ERP”;已登录显示“编辑上架 / 采集商品 / 进入 ERP”。商品编辑模块尚未完成时,“编辑上架”成功后打开 `/collection-test/{collectionItemId}` 供审查采集结果;采集商品只提示进入采集箱。
|
||||
5. Ozon (`ru/kz/by`) 商品详情页显示 Shadow DOM 小浮窗。未登录只显示“登录 Atlas ERP”;已登录显示“编辑上架 / 采集商品 / 进入 ERP”。2026-10-05 起,“编辑上架”采集成功后打开 `/products/{productId}/editor?collection_item_id={collectionItemId}`,按 ERP 当前平台初始化或复用编辑上下文,再展示对应商品编辑页;采集商品只提示进入采集箱。早期采集测试页仍可独立用于解析检查。
|
||||
6. Ozon 解析器保留当前公开 SKU 作为入口证据,优先解析 `state-webAspects-*.data-state.aspects[].variants[]` 的真实变体;不会扫描整页 SKU 或把规格轴做笛卡尔积。来源未给可确认组合时,仍保留当前 SKU。
|
||||
7. Ozon 多 SKU 补全通过受限 MAIN world bridge 调用同源公开页面 JSON:先读取 `modal/aspectsNew` 的 `webAspectsModal`,再以并发 3、上限 100 的队列补全 `/product/<sku>/` 中的标题、价格、画廊和关联 SKU。每个已补全 SKU 的画廊图片使用 `variant_direct` 关联;单个请求失败保留已发现 SKU 与失败证据。
|
||||
8. Ozon 公开响应没有可依赖 SPU/组 ID。服务端在同一来源平台下按新旧 `source_sku` 集合相交覆盖快照;若命中多条历史记录返回 `SOURCE_VARIANT_GROUP_AMBIGUOUS`,不静默合并。
|
||||
@@ -16,8 +16,24 @@
|
||||
10. Ozon 只从 `webGallery` 读取商品画廊,`coverImage` 与 `images[].src` 归为该真实 SKU 的 `source_main + variant_direct`,不会将第二张及以后的画廊图误标为 SKU 图;`webAspects.data.coverImage` 作为 `source_sku + axis_value`。受限 bridge 额外读取固定的富文本页段来获取 `webDescription` / `webRichContent` / `webFeatures` 内的详情图,仍不接触评价或推荐组件。
|
||||
11. 采集数据测试页对未转存候选直接加载 `source_url`;图片展示缩略图,视频采用不预加载的原生播放器,最快核对且不产生对象存储/Worker 下载费用;已经生成 `asset_id` 的历史素材才按 4 路并发申请短时预览 URL。页面会展示关联来源 SKU;预览 URL 不保存到业务数据。Ozon 解析器 `ozon-public-2.3.0` 现额外读取短/完整 `web*Characteristics.characteristics[]` 为公共属性,并将 `webDescription.richAnnotationJson` 转为公共描述文本、原 JSON 放入 `raw_value`。该桥接仍只允许固定 Ozon 页面段和 widget 白名单;已有旧版载荷必须重采集才会拥有这些字段。
|
||||
|
||||
## 2026-10-05 参数失败诊断
|
||||
|
||||
采集提交前按共享载荷契约校验;失败保留字段路径,不静默裁剪真实 SKU。服务端字段错误保留最多三项明细,后台经可序列化响应传回内容脚本,由浮窗显示;不再以后台未处理异常吞掉字段原因。浮窗错误提示只包含业务说明,不包含请求头、Cookie 或令牌。真实来源页无法直接读取时,需用户提供新版字段提示才能确认具体参数根因。
|
||||
|
||||
## 2026-10-06 多 SKU 容量
|
||||
|
||||
真实 1688 组合超过 100 时,旧采集载荷与编辑保存上限会拒绝整条商品。两处现统一提高到 1000,并共享 `PRODUCT_VARIANT_LIMIT`,不会用数组截断丢弃真实组合;首次发布仍按每批最多 50 个选择。采集响应返回实际未删除 SKU 数。1000 SKU 入库、编辑保存、复采身份保留与超限回滚已通过隔离集成测试。
|
||||
|
||||
## 2026-10-06 SKU 数量误采与开发包缓存修订
|
||||
|
||||
解析回退只从明确属性读取直接的对象/数组,不从字段名字符串或 null 跳读其他对象;1688 优先使用同一 skuModel,无来源 ID 的行需完整匹配规格并具有可售证据,元数据不生成 SKU。浮窗显示本次解析的 SKU 数。WXT 构建读取共享源码;开发与正式产物均须核对更新,不能只构建 chrome-mv3 后认为 chrome-mv3-dev 已同步。本次本地复现的 2→150 误采已修复,开发包旧 100 限制已更新,未核验被浏览器策略阻止的实际来源页数量。
|
||||
|
||||
## 配置与安全前提
|
||||
|
||||
2026-10-06 1688 画廊补采:明确读取 `.od-picture-gallery-list > .v-image-cover` 内联背景图,不要求旧外层容器或 200px 缩略图尺寸;排除视频控件、参数图标和 undefined 占位地址,还原 CDN 原图并去重。用户提供的商品 1012823100668 画廊样本得到 15 张独立图片。视频补充读取商品画廊内播放器的 currentSrc/src/source 及明确 gallery 脚本字段中的公开 HTTPS MP4/WebM 地址,DOM 与结构化来源去重、补充封面。仅有封面不会生成视频候选,blob/HLS 和画廊外推荐视频不采集。已完成离线样本、真实浏览器本地 DOM 回归和扩展 22 项测试;实际页面视频地址尚待用户提供播放器或公开直链片段,不能用本地合成视频验证替代实际来源验证。
|
||||
|
||||
2026-10-05 浮窗交互修订:右上角改为 24px 圆形横线最小化按钮(图标 14px),点击隐藏采集面板、显示 40px 圆形「A」入口(文字 20px);点击「A」恢复面板。尺寸按维护者反馈从最初的 32px / 48px 缩小。最小化不销毁面板或清除当前采集提示,同一来源页的登录态/URL 更新沿用折叠状态。两个入口均支持键盘点击和焦点恢复;刷新页面后从展开状态开始。仅扩展展示与交互调整,采集、登录和编辑跳转继续由内容脚本处理。
|
||||
|
||||
- 扩展清单带有仅公开的 RSA `key`,Chrome 因此为自托管和解压加载生成稳定 ID;该 ID 不参与登录授权,严禁提交私钥。
|
||||
- 本地默认 API 为 `http://localhost:8200`。生产构建应为 Atlas API 域配置扩展 host permission 与 `ATLAS_API_ORIGIN`;不需要按用户登记回调 URI。
|
||||
- Web access token 镜像到 Atlas Web 自己的 localStorage 是维护者批准的自托管插件例外;扩展不读取 refresh Cookie、来源站 Cookie 或来源站 localStorage。Worker 不接触浏览器 Cookie。安全取舍见 [`extension-login-alternatives.md`](./extension-login-alternatives.md)。
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
## 测试页
|
||||
|
||||
扩展的“编辑上架”在采集成功后打开 `/collection-test/{collectionItemId}`,而不是进入尚未完成的商品编辑模块。页面只读显示:
|
||||
早期扩展的“编辑上架”在采集成功后打开 `/collection-test/{collectionItemId}`。2026-10-05 起,该按钮改为进入对应商品编辑页;测试页保留为独立解析检查工具,只读显示:
|
||||
|
||||
- 采集来源、解析器版本、状态、SKU 数和素材任务数;
|
||||
- 实际创建的 SKU 草稿及其来源 key;
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
- 采集入箱本身不填写货号;AI 生成以 Atlas 稳定商品标识、已确认类目和实际 SKU 规格为依据,可使用来源信息提炼语义片段,但不得直接复用来源 SKU 作为目标平台货号。
|
||||
- 首次上架前,`model` 必填;每个被选中 SKU 的 `offer_id` 必填,且在目标门店内唯一。生成值和手填值接受相同的保存及发布校验。
|
||||
- 导入成功后,该次平台 SKU 发布记录使用的 `offer_id` 作为历史事实,不允许通过“重新上架”改变;后续编辑在线商品属于另一套平台商品更新能力。
|
||||
- 2026-10-06 维护者要求编辑器以型号作为货号自动前缀、仅输入后缀。前端在型号变化时同步未导入 SKU 的完整货号,保留后缀;已有独立货号完整保留为后缀并进入待保存草稿,不做历史批量写入。导入/进行中货号只读;接口字段仍为完整 `offer_id`,无数据库迁移或服务端规则放宽。
|
||||
|
||||
详细的主动生成、表单回填及冲突处理见 [`../product/ai-autofill-plan.md`](../product/ai-autofill-plan.md)。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user