docs: 建品配方迁至 kb/handbook(留指针)

This commit is contained in:
kb-bot committed 2026-10-21 17:29:56 +08:00
1 parent 917df5b2d6
commit ced43b19d3
9 files changed
+27 -1842

No files matched your search

+3 -46
View File
@@ -1,47 +1,4 @@
# Joom 建品配方(已跑通,批量进行中)
> **本文已迁至内网知识库**:`kb/handbook:docs/ecommerce/dianxiaomi/joom.md`(2026-10-21)。
> 请到 http://192.168.9.206:3000/kb/handbook 阅读最新版;本仓不再维护这份内容。
路由:`https://www.dianxiaomi.com/web/joomProduct/add` 列表:`/web/joomProduct/{draft=采集箱, offline=待发布}`
脚本:`jmbatch.mjs`(`node jmbatch.mjs` 全量 · `node jmbatch.mjs <pid>` 单条 · `--dry` 只构建)
断点:`jm_done.json` 逐条日志:`jm_batch.log` 实际落到的类目:`joom_route.json`
## ⭐ 关键发现:Joom 的表单数据不在 `joom*` store 里
商品主体数据落在 **`smtChoiceAddBasicStore`**(速卖通全托管的 store),
Joom 与 **aliChoice 共用同一套 `smtChoice*` store**。定位方法:在页面上手输一个
哨兵串(`PROBE-TITLE-XYZ`),再遍历所有 pinia store 的 `$state` 找它落在哪。
| 字段 | 落点 |
|---|---|
| 店铺 | `smtChoiceAddBasicStore.formState.shopIds[]` / `shopId`(**店铺是复选框组,不是下拉**) |
| 类目 | `smtChoiceAddBasicStore.formState.categoryId`(复合串 `1473…-16-2-118-2600…`) |
| 标题 / ParentSKU / 描述 / 标签 | `smtChoiceAddBasicStore.formState.{name, parentSku, description, tags[]}` |
| 价格 / 库存 / 运费 / MSRP / 报关金额 | `joomAddPriceStore.formState.{price, inventory, shipping, msrp, declaredValue}` |
| 主图 / 详情图 | `joomAddImageStore.formState.imageList[]` / `detailImageList[0].images[]`(吃 `{url,imgUrl,name,width,height}` 数组) |
| SKU / 颜色 / 尺码 | `joomSkuDataStore.formState.skuDataList[]` / `joomSkuAttrStore.formState.{colorValues,sizeValues}` |
| 自定义属性 | `smtChoiceAddAttrStore.formState.customAttrs[]` |
| 类目属性(`attrsInfo.attrsList` 10 条) | `joomAddStore.attrsInfo`(`joomAddStore` **没有 formState**) |
## 单条顺序(不能换)
1. **勾店铺**:`店铺名称` 是 `.d-checkbox-group-wrapper`,共 **85 个复选框** = `全部` + 84 家店。
勾「第一个非全部」= `Dummer-Pets`。⚠️ **别碰 `全部`**(那是铺满 84 家店)。
2. **选类目**:`产品分类` 是可搜索 `.ant-select`(不是 SHEIN/Temu 的弹窗)。点开 →
`Input.insertText(cat_kw)` → 在 `.ant-select-item-option` 里选**去掉括注后完全相等**的,
没有就退到第一个(Joom 类目比 1688 粗,实测「发圈」只能落到「发夹(Hairpins)」)。
3. 填 store(标题/ParentSKU/描述/标签 + 价格/库存/运费/报关金额 + 主图/详情图)
4. `fillRequiredSelects()`(复用 SHEIN 的兜底)→ **敏感货类型 = 普通货**
5. **详情图语言** → 目标项**标签就叫「详情图」**(不含"语言"二字):
下拉是虚拟滚动的,前 10 项没有「英语」→ 先 `Input.insertText('英')` 过滤,
再点含「英」的项(否则会落到「阿拉伯语」)
6. 保存 → `您的产品已保存到「待发布」`
## 钩子新抓出的两条「没标必填但必须填」
| 被吞的报错 | 真相 |
|---|---|
| `MYJ.error: 运费不能为空` | 运费**没有** `*`,但必须填(给 `0` 即可) |
| `MYJ.error: 请选择详情图语言且至少添加一张详情图` | 语言必选;图片 store 已赋值也要选语言 |
## 与其它平台的差异
- 店铺:Joom 是**复选框组**(多选=铺多店),SHEIN/Temu/Lazada 是下拉
- 类目:Joom 是**可搜索下拉平铺列表**,SHEIN/Temu 是「选择类目」弹窗(搜索→点结果→关弹窗)
- 数据落点:Joom 用 `smtChoice*`(与 aliChoice 同构),SHEIN/Temu 各有自己的 `shein*` / `temu*`
- **不消耗 EAN**(GTIN 非必填、`showGtin=false`)
(原文件内容已移出,历史见本仓 git 记录。)