字段清单:新增《产品数据字段总清单》(830 行)
源资料/中台/平台三层字段口径,四类硬证据: - 店小秘官方导入模板 61 列(/tmp/dxm-Template.xlsx 表头) - 平台接口 raw 字段全集(速卖通191/TikTok167/Shopee141/Walmart35/Ozon10+45/SHEIN48/Lazada61;妙手 TikTok84/Shopee74/Temu73/SHEIN61) - 真·1688 源字段(new20-raw/*.html 的 window.context 模块) - 8 个平台建品脚本落点(逐字段行号)+ 跨平台字段名对照表 含四项口径更正(unitWeight=kg vs weight=g、MOQ 可得、Ozon 无建品脚本、规则库未接线)与硬编码待改清单。
This commit is contained in:
1 parent
e5545331ce
commit
e4679b06c5
1 file changed
+830
+830
@@ -0,0 +1,830 @@
|
|||||||
|
# 跨境电商产品数据字段总清单
|
||||||
|
|
||||||
|
> 生成:2026-09-22 · 作者:KVM-2 DSH agent · 用途:作为**唯一字段口径表**,供建品脚本、数据同步、字段补齐、跨平台映射共用。
|
||||||
|
>
|
||||||
|
> **证据优先级**(本文件所有条目都按此分级,未标注的即"未验证"):
|
||||||
|
> - ★★★ 官方/接口事实:店小秘官方导入模板、平台列表接口返回的真实字段、库内真实文档
|
||||||
|
> - ★★ 代码事实:线上脚本读写过的 store 路径 / selector / 单位换算
|
||||||
|
> - ★ 文档事实:需求文档、技能笔记、注释
|
||||||
|
> - ❓ 待确认:仅为推测或来源冲突
|
||||||
|
>
|
||||||
|
> 主要来源:`listing-spec/建品质量需求.md`(需求单一事实源)、`~/ds·/skills/dianxiaomi-multiplatform-listing`、`/tmp/dxm-Template.xlsx`(官方模板)、`products.listings`(库内 5.8 万条真实文档)、`~/1688-xborder/*.csv`(源资料)、`~/<平台>建品/*.mjs`(线上脚本)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚠ 0. 先处理:妙手同步已"静默失败",但监控报 OK
|
||||||
|
|
||||||
|
`logs/miaoshou-20260922-031701.log`(最新一轮 03:17):
|
||||||
|
|
||||||
|
```
|
||||||
|
Temu全托管 waitPublish ✗ pddkj/waitPublish: 您的授权已经过期,请重新登录
|
||||||
|
…(22 个平台全部同一错误)
|
||||||
|
== 完成 49.5s 错误 22
|
||||||
|
```
|
||||||
|
|
||||||
|
而 `logs/last-status.txt` 写的是 `miaoshou=OK(库内 waitPublish 文档=2870/在线 55462,…)`。
|
||||||
|
|
||||||
|
**机制**:脚本对每个平台 catch 异常后继续跑,`sync_all.sh` **只看退出码** → cookie 过期导致 **0 新增**,但库内旧数据非 0,于是报 OK。
|
||||||
|
**后果**:巡检判据「文档数=0」抓不到这一类故障;妙手的 2870 / 55462 是**旧快照**,不是当前值。
|
||||||
|
**修法**:妙手登录态来自 `/tmp/dxm7` profile(`msp_session.py`,CDP 9223)→ **需重新登录**;并建议给 `sync_all.sh` 增加"本轮新增=0 且错误数>0 → 判 FAIL"的判据(现在只看退出码)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 0. 三层数据模型(先看清字段在哪一层)
|
||||||
|
|
||||||
|
| 层 | 载体 | 字段量级 | 本文件章节 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| **L1 源资料**(选品/采集) | `~/1688-xborder/*.csv`、1688 详情页、内网货盘 | 12–18 列 + 1688 原始 HTML | §1 |
|
||||||
|
| **L2 中台**(店小秘 / 妙手) | Pinia store、官方导入模板、库内 `raw` | 店小秘官方模板 61 列;接口 raw 10–191 字段 | §2 §3 §4 |
|
||||||
|
| **L3 平台**(发布后回读) | 平台接口 `/api/<模块>Product/pageList.json` | 同上(店小秘把平台字段透传进 raw) | §4 §11 |
|
||||||
|
|
||||||
|
**关键认知**:店小秘的 `raw` 字段 ≈ 平台字段超集(速卖通 191 个),我们**归一化了 17 个**用于统计,其余全量躺在 `raw` 里。所以要补任何字段,**先去 `raw` 里找,不要重新爬**。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. L1 源产品资料字段(选品与采集层)
|
||||||
|
|
||||||
|
### 1.1 三套 CSV 的真实表头 ★★★
|
||||||
|
|
||||||
|
| 用途 | 文件 | 列数 | 字段 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 选品候选(1536 行) | `candidates-20260914.csv` | 17 | `sku, pid, title_zh, title_en, cost_cny, weight_kg, est_price_usd, est_margin_pct, score, offer_1688, offer_id, supplier, kb_status, pool_status, stock, image, category` |
|
||||||
|
| 富化核验(60 行) | `enriched-20260914.csv` | 12 | `offer_id, sku, cost_cny_in, title_1688, price_min_cny, price_range_raw, supplier_1688, moq, weight_raw, image_url, valid, note` |
|
||||||
|
| 终选(含来源与克重) | `final-candidates-20260914.csv` | 14 | `offer_id, sku, title, price_1688_cny, pool_cost_cny, weight_g, weight_source, supplier_1688, est_price_usd, est_margin_pct, category, offer_url, image, pool_status` |
|
||||||
|
| 上架包(含俄语文案与定价链路) | `t1-上架包.csv` | 18 | `货号, 品名, offer_id, 供应商, 成本CNY, 克重g, 头程CNY, 公式价KZT, 首发价KZT, 全链路成本KZT, 保本价KZT, 每单利润KZT, 首发毛利pct, 公式价毛利pct, WB参照, 俄语标题, 俄语卖点, 俄语关键词` |
|
||||||
|
|
||||||
|
### 1.2 ★ 真·1688 原始字段(`window.context`,最硬证据)
|
||||||
|
|
||||||
|
> **更正**:上一版把"源资料"等同于 `~/1688-xborder/*.csv`,那是**下游产出**,不是原始采集。
|
||||||
|
> 真·原始数据在 `~/1688-xborder/new20-raw/*.html`(17 个 500–676KB 详情页,BDPM 抓取),
|
||||||
|
> 字段内联在 `window.context.result.data.<模块>.fields` 里。涉及模块:
|
||||||
|
> `productPackInfo` · `priceModel` · `skuInfoMap` · `offerBaseInfo` · `od_product_description` · `od_size_chart` · `consign` · `shippingServices` · `frontSellerMemberModel` · `offerSign`
|
||||||
|
|
||||||
|
**基础信息**
|
||||||
|
| 键名 | 语义 | 单位/格式 | 可得性 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| `offerId` | 1688 商品 ID | 数字串 | ✅ 17/17 |
|
||||||
|
| `<title>` / `subject` | 商品标题 | 中文 | ✅ 17/17 |
|
||||||
|
| `featureAttributes["货号"].value` | 货号/商家编码 | 文本 | ✅ 14/17(常与 `skuInfoMap.specAttrs` 同值) |
|
||||||
|
| `priceModel.currentPrices[].price` | 阶梯价 | **¥** | ✅ 17/17 |
|
||||||
|
| `priceModel.currentPrices[].beginAmount` | **起订量 MOQ** | 整数 | ✅ 17/17(首档即 MOQ) |
|
||||||
|
| `priceModel.currentPricesWithOnePiece[]` | 一件代发价 | ¥ | ✅ |
|
||||||
|
| `originalPricesWithoutPromotion[]` / `discountPrice` | 原价/折后价 | ¥ | ✅ |
|
||||||
|
| `skuPriceScale` | 价格区间串 | `"2.80-3.50"` | ✅(→ CSV `price_range_raw`) |
|
||||||
|
| `canBookCount` | 可订库存 | 整数 | ✅(值常夸张,如 `99985537`) |
|
||||||
|
| `saledCount` | 销量 | 整数 | ✅(可能虚高) |
|
||||||
|
| `postCategoryId` / `topCategoryId` | 1688 类目 | 整数 | ✅ 但**不可直接映射平台类目** |
|
||||||
|
|
||||||
|
**图片(全外链 `cbu01.alicdn.com`)**
|
||||||
|
| 键名 | 语义 | 说明 |
|
||||||
|
|---|---|---|
|
||||||
|
| `imageList[].fullPathImageURI` | **主图原图** | 直接可用 |
|
||||||
|
| `imageList[].imageURI` | 主图相对路径 | 需拼域名 |
|
||||||
|
| `imageList[].{searchImageURI,size220x220ImageURI,size310x310ImageURI,summImageURI}` | 各尺寸缩略变体 | 还原规则见 `fetch_1688_imgs.py:19-27` |
|
||||||
|
| `od_product_description.fields.detailUrl` | **详情图容器** | ⚠ 是外链 JS bundle(`itemcdn.tmall.com/1688offer/icoss<hash>`),**必须二次抓取** |
|
||||||
|
| `valueImageUrl`(规格/变种图) | 变种图 | ❌ **17 个样本非空 = 0** → 变种图源头拿不到 |
|
||||||
|
| `cbu01.alicdn.com/cms/upload/*` | 页面小图标 | ⚠ 必须滤掉(不是商品图) |
|
||||||
|
|
||||||
|
**物流(重量/尺寸)—— 单位是雷区,见 §1.5**
|
||||||
|
| 键名 | 语义 | 单位 | 可得性 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| `productPackInfo.fields.unitWeight` | 商品件重 | **千克 kg** | ⚠ 11/17 有值,**6/17 为 `0`(未填≠零重)** |
|
||||||
|
| `productPackInfo.fields.pieceWeightScale.pieceWeightScaleInfo[].weight` | 单件重量 | **克 g** | ✅ 15/17 |
|
||||||
|
| `…pieceWeightScaleInfo[].length/width/height` | 长/宽/高 | **厘米 cm** | ⚠ 常为 `0.0`(9/17 全零) |
|
||||||
|
| `…pieceWeightScaleInfo[].volume` | 体积 | **cm³** | ✅ 有值时正确 |
|
||||||
|
| `…pieceWeightScaleInfo[].{sku1,sku2,skuId}` | 变体值/SKU ID | 文本/整数 | ✅ |
|
||||||
|
| `…columnList[].label` | 表头定义 | `长(cm)`/`宽(cm)`/`高(cm)`/`体积(cm³)`/`重量(g)` | ✅ **单位口径的权威来源** |
|
||||||
|
| `freightInfo.unitWeight` / `shippingServices.fields.unitWeight` | 运费重量 | kg | ✅ 与 `productPackInfo` 同值 |
|
||||||
|
|
||||||
|
**供应链**
|
||||||
|
| 键名 | 语义 | 可得性 |
|
||||||
|
|---|---|---|
|
||||||
|
| `companyName` | 供应商公司全称 | ✅ 17/17 |
|
||||||
|
| `sellerLoginId` | 供应商店铺名 | ✅(→ CSV `supplier_1688`) |
|
||||||
|
| `sellerUserId` / `sellerMemberId` | 供应商 ID | ✅ |
|
||||||
|
| `winportUrl` | 供应商旺铺 | ✅ |
|
||||||
|
| `featureAttributes["产地"].value` | **产地** | ✅ 9/17,**只到省市**(义乌/金华/浙江/广州/莆田/河北) |
|
||||||
|
| `featureAttributes["是否进口"]` | 是否进口 | ✅ 4/17(实测全"否") |
|
||||||
|
| `<span class="location">` | 发货地 | ⚠ 仅 HTML 文本,不在 JSON |
|
||||||
|
| `deliveryLimitText` | 发货承诺 | ✅(如"承诺48小时发货") |
|
||||||
|
| `featureAttributes["主要下游平台"/"主要销售地区"]` | 渠道/地区 | ✅ 6–7/17 |
|
||||||
|
|
||||||
|
**属性与变种**
|
||||||
|
- 统一容器 `featureAttributes[] = {fid,name,value,values,vids,outputType,isSpecial,…}`
|
||||||
|
- 实测属性名(按出现文件数):`货号`(14) `品牌`(13) `是否跨境出口专供货源`(12) `材质`(9) `产地`(9) `有可授权的自有品牌`(8) `颜色`(7) `上市年份/季节`(7) `处理工艺`(6) `图案`/`流行元素`/`适用送礼场合`(5) `风格`/`包装`/`生产编号`(3) `尺码`/`型号`/`规格`(1–2),另有 80+ 类目长尾属性
|
||||||
|
- 变种:`skuInfoMap` / `skuInfoMapOriginal` ✅ 17/17,值 `{specId,saleCount,canBookCount,specAttrs,priceAmount,skuId,isPromotionSku}`;`isSkuOffer:true` 16/17
|
||||||
|
|
||||||
|
**其他**
|
||||||
|
| 项 | 状态 |
|
||||||
|
|---|---|
|
||||||
|
| 尺码表 `od_size_chart` | ✅ 模块存在,尺码图需从中提取 |
|
||||||
|
| 平台评分/评价数 | ❌ **1688 详情页不存在**(评分只在需求侧 WB/Ozon 有) |
|
||||||
|
| EAN / UPC / 条码 | ❌ **全页 689 个 JSON 键无任何 barcode/upc/ean** |
|
||||||
|
|
||||||
|
### 1.2b 建品输入包(下游包,**不是源资料**)
|
||||||
|
|
||||||
|
`~/<平台>建品/*_input.json`(46–48 项,顶层键 = offer_id),每项只有 **11 个字段**:
|
||||||
|
- `walmart建品/wm_input.json`:`title, bullets, keywords, imgs, weight, ean, pc, cat_index, cat, price_usd, weight_lbs`
|
||||||
|
- `tiktok建品/tk_input.json`:`title, bullets, keywords, imgs, cost, weight, price_cny, price_myr, guess, cat_kw, cat_fb`
|
||||||
|
|
||||||
|
⚠ **`weight` 是硬编码三档 `100/130/10`,不是实测值**(`tk_input.json` 的 `guess` 字段字面写着 `'cost~,w~'` 自认是猜的)。
|
||||||
|
⚠ 全量口径:`最终开品清单.csv` 的 `weight_src` 分布 = `占位100g` **213** 行 vs `L2实核` **20** 行 → **只有 8.6% 的重量是真核过的**。
|
||||||
|
|
||||||
|
### 1.3 源资料字段语义归并(建品脚本实际消费的)
|
||||||
|
|
||||||
|
| 归一字段 | 脚本里的名字 | 语义 | 单位 | 说明 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 货源 ID | `offer_id` / `oid` | 1688 商品 ID | — | 唯一键;来源 URL = `https://detail.1688.com/offer/<oid>.html` ★★ |
|
||||||
|
| 货号 | `sku` | 我方货号 | — | 平台 SKU 由它派生(如 `WM-<oid>`) |
|
||||||
|
| 标题 | `IN.title` / `it.title` / `title_1688` / `title_en` | 商品标题 | — | 1688 原文(中文/英文两版) |
|
||||||
|
| 卖点 | `IN.bullets` / `it.bullets` | 要点列表 | — | 描述与 keyFeatures 的原料 |
|
||||||
|
| 关键词 | `IN.keywords` / `it.keywords` | 搜索词 | — | 逗号分隔;TikTok 取前 10 个 ★★ |
|
||||||
|
| 类目猜词 | `IN.cat_kw` / `it.cat_kw` | 类目匹配关键词 | — | ⚠ 类目靠猜是已知缺陷(需求 §3.1 #1) |
|
||||||
|
| 元卖 | `IN.sp_kw` / `IN.sp_fb` | Shopee 关键词/回退 | — | Shopee 专用 |
|
||||||
|
| 成本 | `IN.cost` / `it.cost` / `cost_cny` / `pool_cost_cny` | 进货成本 | CNY | 定价模型输入 |
|
||||||
|
| 1688 价 | `price_min_cny` / `price_1688_cny` / `price_range_raw` | 供货价 | CNY | `price_range_raw` 是原始区间串 |
|
||||||
|
| 重量 | `IN.weight` / `it.weight` / `weight_g` / `weight_kg` / `weight_raw` | 商品重量 | **口径不一,见 §1.5** | 🔴 最大雷区:源头 kg/g 两个字段并存;下游 `weight` 多为硬编码占位 |
|
||||||
|
| 图片 | `IN.imgs` / `it.imgs` / `image` / `image_url` | 主图+详情图混装 | URL 数组 | ⚠ 混装,必须过 `filterProductImages()` ★★;详情图需二次抓取 |
|
||||||
|
| 供应商 | `supplier_1688` / `supplier` | 供应商名 | — | 产地字段的来源(只到省市) |
|
||||||
|
| 起订量 | `moq` / `priceModel.currentPrices[].beginAmount` | 最小起订 | 件 | ⚠ **实际可得**(旧文档称"取不到"是错的);但 L2 CSV 的 `moq` 列**全空**是脚本没提 |
|
||||||
|
| 库存 | `stock` / `canBookCount` | 1688 库存 | 件 | 值常夸张,仅方向性 |
|
||||||
|
| 定价结果 | `est_price_usd, est_margin_pct, score` + `公式价KZT/保本价KZT/…` | 定价与经济性 | USD/KZT | 选品阶段算出 |
|
||||||
|
| 多语言文案 | `俄语标题/卖点/关键词` | 本地化文案 | — | 目前仅俄语(Ozon/WB 线) |
|
||||||
|
|
||||||
|
### 1.4 源资料的**结构性缺口**(L1 拿不到、必须人工或另找)
|
||||||
|
|
||||||
|
| 缺口 | 影响的平台 | 现实做法 | 证据 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| **品牌** | 全平台 | 一律 `无品牌`;**源头 `品牌` 属性 13/17 有值但不可信**(常为 `自主`/`其他`/`否`,或供应商乱填的品牌名,发布前必须清) | ★★★ |
|
||||||
|
| **EAN/UPC/ISBN** | Temu/Walmart/速卖通 SKU | 全页 689 个 JSON 键**无任何 barcode/upc/ean** → 走自家 EAN-13 台账(`69803093` 段),用号必须落 S03 台账 | ★★★ |
|
||||||
|
| **原产国 / 产地** | Walmart(Country of Origin)、速卖通(产地必填) | 源头 `产地` **只到省市**(义乌/浙江/金华/广州/莆田/河北),`是否进口`=否 → 默认 `China` | ★★★ |
|
||||||
|
| **包装尺寸** | Walmart(inch)、Temu、Shopee | ⚠ **9/17 样本长宽高全为 0.0**;建品 CSV 里的 `15/10/3` 是**人工默认值**,与 1688 源无对应关系。真值须实测或问供应商 | ★★★ |
|
||||||
|
| **发运重量** | 全平台 | `unitWeight` 是**单件属性值**,未必含外包装(实测有 `1g` 的离谱值)→ 代码统一加 `--weight-buffer 1.3` | ★★★ |
|
||||||
|
| **净重 vs 毛重** | Temu(净重必须<重量) | 源头只有件重,净重需估算或人工 | ★★ |
|
||||||
|
| **规格/变种图** | TikTok/速卖通/Walmart 变参图 | ❌ `valueImageUrl` **17 个样本非空 = 0** → 无自动来源,需从主图/详情图裁切 | ★★★ |
|
||||||
|
| **详情图** | Shopee/Temu/速卖通 | **不在主 HTML 里**:`od_product_description.fields.detailUrl` 是外链 JS bundle,必须二次抓取 | ★★★ |
|
||||||
|
| **MOQ** | 铺货一般不用 | ✅ **其实拿得到**(`priceModel.currentPrices[0].beginAmount`);旧文档"取不到"的说法源于早期只读属性表文本 | ★★★ |
|
||||||
|
| **HS / ТН ВЭД 编码** | Ozon/Walmart | 源头无此字段 → 走自有 HS 字典(中国 10 位 12,030 / ЕАЭС 9 位 12,937 / 国际 6 位 5,613) | ★★ |
|
||||||
|
| **平台类目映射** | 全平台 | 1688 `postCategoryId/topCategoryId` **不可直接映射**平台类目树 | ★★★ |
|
||||||
|
| **高关注化学品 / 加州65** | 速卖通、Walmart | 填 `none`(速卖通写死 id `23399591357`) | ★★ |
|
||||||
|
| **产品说明书文件** | 速卖通(部分类目强制) | 无来源 → 需生成或跳过该类目 | ★ |
|
||||||
|
| **视频** | 速卖通、TikTok | 无来源 → 需图生视频或人工 | ★★ |
|
||||||
|
| **平台评分/评价数** | 选品参考 | ❌ 1688 详情页**无评分字段**(评分只在需求侧 WB `feedbacks/rating`、Ozon `reviews/rating`) | ★★★ |
|
||||||
|
| **供应商可用性** | 全平台 | 1688 链接有效率:`inactive` 品 **25%**、`active` 品 **62%** → 必须实核,失效标 `invalid`,不许编数据 | ★★ |
|
||||||
|
|
||||||
|
### 1.5 🔴 重量单位口径(本项目最贵的一类事故)
|
||||||
|
|
||||||
|
**同一页有两条重量、两种单位,读错差 1000 倍:**
|
||||||
|
|
||||||
|
| 字段 | 单位 | 说明 |
|
||||||
|
|---|---|---|
|
||||||
|
| `productPackInfo.fields.unitWeight` | **千克 kg** | 如 `0.010` = 10g |
|
||||||
|
| `…pieceWeightScaleInfo[].weight` | **克 g** | 同模块 `columnList.label` 直接写 `重量(g)` |
|
||||||
|
| `…length/width/height` | **厘米 cm** | label `长(cm)`/`宽(cm)`/`高(cm)` |
|
||||||
|
| `…volume` | **cm³** | label `体积(cm³)` |
|
||||||
|
| L2 CSV `weight_raw` | 文本 | 形如 `重量(g)=75`(来自属性表文本,不是 JSON) |
|
||||||
|
|
||||||
|
**17 样本交叉验证结果**:**8 个一致 / 1 个冲突 / 6 个 `unitWeight=0`(未填)/ 2 个无包装表**。
|
||||||
|
🔴 冲突样本 `800850312791`:`unitWeight=0.001`(1g) vs 包装表 `50g`,**差 50×**。
|
||||||
|
|
||||||
|
**三个必须记住的坑**
|
||||||
|
1. **`unitWeight` 是 kg 不是 g**。技能 `1688-cross-border-sourcing/SKILL.md:55` 只写"重量单位是克"(那句针对的是属性表文本),照着读 `unitWeight` 会把 10g 当 0.010g。
|
||||||
|
2. **`unitWeight = 0` 表示"未填",不是"零重"**(6/17)。`ozon_unit.py:86` 直接 `weight_g/1000.0` 而不判 0 → 会算出零运费、虚高毛利。
|
||||||
|
3. **历史事故**(该技能原文):① "数值>50 才除 1000" → 10g 当 10kg,**毛利 -2381%**;② 改成"数值<5 就当 kg" → `重量(g)=3` 又变 3000g。**正确做法是单位优先,其次按列语义兜底**(实现见 `ru_market.py:215-236`)。
|
||||||
|
|
||||||
|
### 1.6 口径冲突清单(不同脚本/文档互相打架,接线前必须裁决)
|
||||||
|
|
||||||
|
| 冲突 | A 说法 | B 说法 | 裁决 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 重量启发式 | `select_candidates.py:95`:">50 视为 g"(面向 Mongo `package_weight`,本身是 kg) | `ru_market.py:215-236`:单位优先,1688 详情无单位时**默认按 g** | 面向不同数据源;**同一合并表里两列并存**(`weight_raw`=g / `weight_kg_pool`=kg),套错列就出事故 |
|
||||||
|
| 抓取正路 | `1688-cross-border-sourcing`(英):详情页**唯一可靠是 Desktop CDP**,Firecrawl/Jina/直连都不行 | `1688-crossborder-sourcing`(中):**BDPM curl 才是正路**(实测 4/4 成功、124–133KB),比派浏览器 agent 可靠 | 实际 `new20-raw/*.html` 是 500–676KB 正常页,**与 BDPM 路线吻合** |
|
||||||
|
| MOQ 可得性 | 两个技能均称"取不到/不可靠" | raw 页 `beginAmount` 出现 20 次 | **B 正确**,规格源于早期实现缺失 |
|
||||||
|
| 库名 | 英技能写 `premiumproducts.products` | 中技能与 `premiumproducts-db` 写 `productpool1.products`(221,874) / `premiumproducts.products` | 未裁决 ⚠ |
|
||||||
|
| 失效引用 | 英技能引用 `~/.hermes/scripts/1688_scrape_cdp.py` 与 `references/*` | — | **本机不存在**(该技能只剩单文件)⚠ |
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 店小秘官方导入模板字段(61 列,权威口径)★★★
|
||||||
|
|
||||||
|
来源:`/tmp/dxm-Template.xlsx`(官方 Template,`build_dxm_import.py` 直接读取表头,不手抄)。
|
||||||
|
表头形如 `*ParentSKU\n(必填)`,代码用 `core()` 归一化后匹配——**坑:直接用短名匹配会全部取空,文件表面看不出必填列全空**(脚本注释原话)。
|
||||||
|
|
||||||
|
| 分组 | 列号 | 字段(官方表头) | 必填 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| **标识** | 1 | `*ParentSKU` | ✅ |
|
||||||
|
| | 2 | `*SKU` | ✅ |
|
||||||
|
| | 7 | `UPC` | |
|
||||||
|
| | 8 | `landingPageUrl` | |
|
||||||
|
| **文案** | 3 | `*产品标题` | ✅ |
|
||||||
|
| | 4 | `*产品描述` | ✅ |
|
||||||
|
| | 5 | `产品标签` | |
|
||||||
|
| | 44 | `英文申报名称` | |
|
||||||
|
| | 45 | `申报的本地名称` | |
|
||||||
|
| **品牌/属性** | 6 | `品牌` | |
|
||||||
|
| | 10 | `颜色` | |
|
||||||
|
| | 11 | `尺寸值` | |
|
||||||
|
| | 9 | `msrp` | |
|
||||||
|
| **来源** | 12 | `来源url` | |
|
||||||
|
| **价格** | 13 | `*价格(USD)` | 美元店铺必填 |
|
||||||
|
| | 14 | `*价格(CNY)` | 人民币店铺必填 |
|
||||||
|
| | 15 | `*运费(USD)` | 美元店铺必填 |
|
||||||
|
| | 16 | `*运费(CNY)` | 人民币店铺必填 |
|
||||||
|
| | 49 | `申报价值(USD)` | |
|
||||||
|
| **库存** | 17 | `*库存量` | ✅ |
|
||||||
|
| **图片** | 18 | `主图(URL)地址` | |
|
||||||
|
| | 19 | `变种图(URL)地址` | |
|
||||||
|
| | 20–38 | `附图1…附图19(URL)地址` | |
|
||||||
|
| | 39 | `附图20-100(URL)地址` | |
|
||||||
|
| **物流/海关** | 43 | `重量(g)` | |
|
||||||
|
| | 46/47/48 | `包裹长度/宽度/高度(cm)` | |
|
||||||
|
| | 42 | `海关HS编码` | |
|
||||||
|
| | 50 | `件数` | |
|
||||||
|
| | 51 | `发货地区代码` | |
|
||||||
|
| **合规** | 52–55 | `是否含粉末/液体/电池/金属` | |
|
||||||
|
| | 56 | `加州65号提案警告类型` | |
|
||||||
|
| | 57–61 | `加州65号提案化学品名称1..5` | |
|
||||||
|
| **其他** | 40 | `备注` | |
|
||||||
|
| | 41 | `产品状态` | |
|
||||||
|
|
||||||
|
> 注:这份模板偏 **Walmart/通用** 口径(有 UPC、msrp、landingPageUrl、加州65)。它是"产品级"字段;**平台级的必填项不在这张表里**,必须走各平台添加页(见 §4)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 跨平台通用产品主档(语义归一,建议内部统一命名)
|
||||||
|
|
||||||
|
这是"我们应该在内部统一维护的最小完备集"。`必要性` 列的 ⭐ 表示"几乎所有平台都要"。
|
||||||
|
|
||||||
|
### 3.1 标识与来源
|
||||||
|
| 字段 | 单位/格式 | 来源 | 必要 | 备注 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| `oid` | 字符串 | 1688 | ⭐ | 主键;来源 URL 由它拼 |
|
||||||
|
| `sku` / `parentSku` | 字符串 | 我方 | ⭐ | 店小秘模板列 1、2 |
|
||||||
|
| `sourceUrl` | URL | 1688 | ⭐ | 速卖通 #9、Walmart #1 都要求 ★★ |
|
||||||
|
| `ean` / `upc` / `isbn` | 13 位 | EAN 台账 | 平台相关 | Walmart 要 **ISBN**(不是 UPC);Temu 要 EAN ★★ |
|
||||||
|
| `hsCode` | 字符串 | 人工/类目库 | | 模板列 42 |
|
||||||
|
| `platformProductId` | 字符串 | 平台回读 | | 发布后才有 |
|
||||||
|
|
||||||
|
### 3.2 文案
|
||||||
|
| 字段 | 上限 | 规则 | 备注 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| `title` | Walmart **100**、Temu **120** | 过 `filterTitle()`;窄义词**同义替换**(策略 B)+ 长度兜底 | ★★ |
|
||||||
|
| `bullets` | — | 逐条过 `filterTitle` | Walmart `keyFeatures`、TikTok 描述 |
|
||||||
|
| `keywords` | TikTok 取前 **10** | — | |
|
||||||
|
| `description`(HTML) | — | **必须含 `<img>` 产品图**(速卖通 #7/TikTok #3/Temu #3) | ★★ |
|
||||||
|
| `mobileDescription`(HTML) | — | 无线端单独字段(Temu `describeInfoData.mobileDetail`) | ★★ |
|
||||||
|
| `searchTerms` | — | TikTok 独立字段 | ★★ |
|
||||||
|
|
||||||
|
### 3.3 交易
|
||||||
|
| 字段 | 单位 | 规则 | 备注 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| `price` | 平台币种 | 见 §5 币种 | ★ |
|
||||||
|
| `原价/originalPrice` | 同上 | Ozon 要求 **售价 < 原价**,改价必须同时抬原价 | ★★ |
|
||||||
|
| `declaredValue` | 同上 | **与售价一致**(速卖通 #6) | ★★ |
|
||||||
|
| `stock` | 件 | — | ⭐ |
|
||||||
|
| `currency` | ISO | Ozon/TikTok/Shopee 各不同 | ★★ |
|
||||||
|
| `msrp` | USD | 模板列 9 | |
|
||||||
|
| `运费` | USD/CNY | 模板列 15/16;速卖通走运费模板 | ★ |
|
||||||
|
| `promotionPrice` | — | Walmart 字段 | |
|
||||||
|
|
||||||
|
### 3.4 物流与包装
|
||||||
|
| 字段 | 单位 | 规则 | 备注 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| `weight` | 见 §5 | 源克 → 平台单位,**必须显式换算** | ★★ 曾把 130g 写成 130KG |
|
||||||
|
| `netWeight` | 同上 | Temu **净重必须 < 重量** | ★★ |
|
||||||
|
| `packageLength/Width/Height` | cm 或 inch | **不得用重量推算**;Walmart 转英寸 | ★★ |
|
||||||
|
| `shippingWeight` | lbs | Walmart 专用 | ★★ |
|
||||||
|
| `freightTemplate` / `promiseTemplate` | id | 速卖通 | ★★ |
|
||||||
|
| `warehouse` / `发货地区代码` | — | TikTok/Walmart | ★★ |
|
||||||
|
| `含粉末/液体/电池/金属` | bool | 模板列 52–55 | |
|
||||||
|
|
||||||
|
### 3.5 图片与视频
|
||||||
|
| 字段 | 格式 | 规则 |
|
||||||
|
|---|---|---|
|
||||||
|
| `mainImages[]` | 外链数组 `{url,imgUrl,name,width,height(,checked)}` | 上传前过 `filterProductImages()`(剔详情图)★★ |
|
||||||
|
| `variantImages[]` | 同上 | **每个变种只放自己的图,不能串图**(TikTok #4/Walmart #7/速卖通 #8)★★ |
|
||||||
|
| `mainImage`(单图串) | `\|` 分隔 | Walmart/Temu 的落库形态 ★★ |
|
||||||
|
| `squareImage` | 单图 | SHEIN 方图字段 ★★ |
|
||||||
|
| `materialImage` / `packageImages` | 数组 | Temu 专用 ★★ |
|
||||||
|
| `sizeChartImage` | 单图 | Temu 第 4 张 = **cm/inch 双标尺寸图** ★★ |
|
||||||
|
| `whiteBgImage` | ≥800×800 | 内网 FlairGS `/api/white-bg`,3.6s,可用 ★★ |
|
||||||
|
| `sceneImage` | 3:4 | flux 可用但构图不合格;forge 不可用 ★★ |
|
||||||
|
| `video` / `videoUrl` | URL | 速卖通/TikTok 有槽位,当前未填 ★ |
|
||||||
|
|
||||||
|
### 3.6 变种
|
||||||
|
| 字段 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| `variantTheme` | 变种主题(颜色/尺码);TikTok 还要求**主题图** ★★ |
|
||||||
|
| `option1/2/3` + `option1Value/...` | TikTok raw 字段命名(最多 3 个变种维)★★ |
|
||||||
|
| `skuDataList[]` | Temu 的 SKU 行:`length,width,height,weight,netWeight` + 货号/EAN/价格 ★★ |
|
||||||
|
| `variantList[]` | 通用:`sku, price, salePrice, quantity, imageList, weight, packageL/W/H` ★★ |
|
||||||
|
| `saleProp` / `propertyInfo` | Lazada/Shopee 变种属性 ★★ |
|
||||||
|
|
||||||
|
### 3.7 合规
|
||||||
|
| 字段 | 取值 | 来源 |
|
||||||
|
|---|---|---|
|
||||||
|
| `brand` | **`无品牌`** | 硬要求 ★★ |
|
||||||
|
| `isNoBrand` | `true` | Walmart **独立开关**(`walmartAttrStore.isNoBrand`),光写 brand 不生效 ★★ |
|
||||||
|
| `countryOfOrigin` | `China` | Walmart `Country of Origin-Substantial Transformation` ★★ |
|
||||||
|
| `manufactureId` / `产地` | 供应商产地或固定 id | 速卖通写死 `9441741844`(待改)★★ |
|
||||||
|
| `高关注化学品` | `none` | 速卖通写死 id `23399591357`(待改)★★ |
|
||||||
|
| `productManual` | 文件 | 速卖通类目相关强制 ★ |
|
||||||
|
|
||||||
|
### 3.8 店铺与类目
|
||||||
|
| 字段 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| `shopId` | 店铺;TikTok/Walmart/Ozon 用下拉 |
|
||||||
|
| `siteIds[]` / `sites` | TikTok 多站点(全选后 `["5880928","5880883","5880945"]`)★★ |
|
||||||
|
| `categoryId` / `fullCid` | 类目;**必须与店铺授权类目对应**,不得猜 ★★ |
|
||||||
|
| `categoryName` / `nodePath` | 展示名/路径 |
|
||||||
|
| `attributes` / `productAttributes` | 类目属性(各平台结构不同) |
|
||||||
|
| `sizeChart` / `sizeTemplateId` | 尺码表 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 各平台字段对照(店小秘侧)
|
||||||
|
|
||||||
|
### 4.1 平台清单与规模 ★★★(库内真实数据,`products.listings`)
|
||||||
|
|
||||||
|
**店小秘(source=dianxiaomi)**
|
||||||
|
|
||||||
|
| 平台 | 接口模块 | raw 字段数 | 待发布 | 在线 | 发布失败 |
|
||||||
|
|---|---|---:|---:|---:|---:|
|
||||||
|
| 速卖通 | `smtProduct` | **191** | 293 | 1,682 | — |
|
||||||
|
| 速卖通全托管 | `smtProduct`(cus) | 126 | 34 | 185 | 2 |
|
||||||
|
| Ozon | `ozonProduct` | 10 + `products[]` 45 | 52 | 20,415(组 2,593) | — |
|
||||||
|
| TikTok | `tiktokProduct` | **167** | — | 4,257 | — |
|
||||||
|
| Shopee-全球 | `shopeeProduct` | **141** | 1 | 3,577 | — |
|
||||||
|
| Walmart | `walmartProduct` | 35 | 48 | 2,090(组 1,068) | 6 |
|
||||||
|
| SHEIN | `sheinProduct` | 48 | — | 710 | — |
|
||||||
|
| Lazada | `lazadaProduct` | 61 | — | — | — |
|
||||||
|
| (Joom / aliChoice) | — | — | 未接入同步 | — | — |
|
||||||
|
|
||||||
|
**妙手(source=miaoshou)**
|
||||||
|
|
||||||
|
| 平台 | key | raw 字段数 | 待发布 | 在线 |
|
||||||
|
|---|---|---:|---:|---:|
|
||||||
|
| Temu 全托管 | `pddkj` | 73 | 45 | **55,462** |
|
||||||
|
| TikTok | `tiktok` | 84 | 2,744 | — |
|
||||||
|
| Shopee | `shopee` | 74 | 37 | — |
|
||||||
|
| SHEIN | `shein` | 61 | 44 | — |
|
||||||
|
| Ozon | `ozon` | — | 采集箱 1,555(未发布) | — |
|
||||||
|
|
||||||
|
### 4.2 平台字段落点(写入路径)★★
|
||||||
|
|
||||||
|
> 落点 = Pinia store 路径 或 DOM selector。**改 store ≠ 落库**,见 §10。
|
||||||
|
|
||||||
|
**Walmart**(保存体是 **zip 的 multipart**,内含 `walmartSave.txt`)
|
||||||
|
| 字段 | 落点 |
|
||||||
|
|---|---|
|
||||||
|
| Product Name | `walmartProductStore.formState.productName` |
|
||||||
|
| 产品标识符类型 | `walmartProductStore.formState.productIdType` = **`ISBN`**(原 UPC,已改) |
|
||||||
|
| 产品标识符值 | `walmartProductStore.formState.productId` |
|
||||||
|
| 品牌 | `walmartAttrStore.formState.brand` = `无品牌`;**并** `isNoBrand=true` + 点 `.ant-checkbox-wrapper` |
|
||||||
|
| 价格/库存/运输重量 | `walmartPriceShippingStore.formState.{price, inventory, shippingWeight}`(重量 **lbs**) |
|
||||||
|
| 描述/keyFeatures | `walmartDescStore.formState`(HTML bullets) |
|
||||||
|
| 主图 | `walmartImgStore.formState.mainImage`(**必须 hover→「网络图片」贴 URL**)⚠ 当前不落库 |
|
||||||
|
| 来源URL / Country of Origin | 页面 DOM 字段(已确认存在,待接) |
|
||||||
|
| 变种 | `basic.hasVariant=false`(**当前被关掉**,需求 #7 要求开启) |
|
||||||
|
|
||||||
|
**Temu**
|
||||||
|
| 字段 | 落点 |
|
||||||
|
|---|---|
|
||||||
|
| productName | `temuAddProductStore.$state.formState.productName` |
|
||||||
|
| 主图/材质图/包装图 | 同 store `.mainImage / .materialImage / .packageImages` |
|
||||||
|
| 描述(PC/无线) | `temuAddStore.$state.describeInfoData.{detail, mobileDetail}` |
|
||||||
|
| 类目 | `temuAddBasicStore.$state.formState.categoryId`(store 直读类目 1038 个) |
|
||||||
|
| SKU 行 | `temuAddSkuDataStore.$state.formState.skuDataList[]`(`length/width/height/weight/netWeight`) |
|
||||||
|
| 变种属性 | `temuAddSkuAttrStore.$state.formState`(用 `.theme-value-add` 手动输值+添加,改 store 无效) |
|
||||||
|
| 其他 | `temuAddOtherStore.$state` |
|
||||||
|
| ⚠ 条件必填 | 产地=中国 → **省份必填**;报错层层递进 |
|
||||||
|
|
||||||
|
**TikTok**(价格 **MYR**)
|
||||||
|
| 字段 | 落点 |
|
||||||
|
|---|---|
|
||||||
|
| 店铺/站点 | `tiktokGlobalAddBasicStore.formState.{shopId, siteIds, categoryId}`(多国+复制用「全选」) |
|
||||||
|
| 标题/关键词/描述 | `tiktokGlobalAddProductStore.formState.{productName, searchTerms, description}`(描述含 `<img>`) |
|
||||||
|
| 品牌 | `tiktokGlobalAddStore.attrsInfo` = `无品牌` |
|
||||||
|
| 货到付款 | `tiktokGlobalAddOtherStore.$state.logisticsFormState.isCodOpen = 1`(**不是** `dxFormState`) |
|
||||||
|
| 主图 | `tiktokGlobalImgStore.formState.mainImage[]` |
|
||||||
|
| 变种图 | `skuDataList[i].image` / `tiktokGlobalSkuUsImageStore.skuUsImageMap`(**美国站专用**,本店 `isSupportSkuUsImage=false`)⚠ 未完成 |
|
||||||
|
| 重量/尺寸 | 重量 `setItem('重量')`;尺寸规格三个 input 按 placeholder 长/宽/高(回读 `长=130 宽=78 高=26`) |
|
||||||
|
| 来源URL | `setItem('来源URL')` = `https://detail.1688.com/offer/<oid>.html` |
|
||||||
|
|
||||||
|
**速卖通**(价格含税;`check_box` 属性值必须是数组)
|
||||||
|
| 字段 | 落点/说明 |
|
||||||
|
|---|---|
|
||||||
|
| 品牌 | 属性:`无品牌` / `NONE(无品牌)` |
|
||||||
|
| 产地 | 属性 id `9441741844`(**硬编码,待改**) |
|
||||||
|
| 高关注化学品 | 属性 id `23399591357`(**硬编码**,应 `none`) |
|
||||||
|
| 图片 | `imageList`,外链对象 `{id,url,name,width,height,imgId,checked}` |
|
||||||
|
| 描述 | CKEDITOR(PC+无线),需插图 + 规范 HTML |
|
||||||
|
| 价格/货值 | `零售价`/`货值`(原硬编码 1.99/0.50,须一致) |
|
||||||
|
| 重量/尺寸 | 原硬编码 `0.02kg` / `10×5×3`(待用 1688 实抓) |
|
||||||
|
| 运费/服务模板 | `freightTemplateId` / `promiseTemplateId` |
|
||||||
|
| SKU | `smtProductSkuList[]`(含 `eanCode, skuPrice, skuStock, skuImage, packageWeight…`) |
|
||||||
|
| 说明书 | `productManual`(类目相关**强制**,缺失会被 `MYJ.message.error` 吞掉) |
|
||||||
|
|
||||||
|
**SHEIN**
|
||||||
|
| 字段 | 落点 |
|
||||||
|
|---|---|
|
||||||
|
| 图片 | `sheinImgStore.formState.squareImage`(方图) + `mainImgData.{multipleSpuImgs, singleSpuImg}` ⚠ **全部写住仍不落库**,见 §10 |
|
||||||
|
| 类目 | 需**两个规格**(点 `.theme-select-box` 加 `尺寸(Size)`) |
|
||||||
|
| 顺序 | 必须「规格 → SKU → 尺码表」(加规格会**重建 SKU 行**) |
|
||||||
|
|
||||||
|
**Shopee**
|
||||||
|
| 字段 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| 列表字段名 | `itemName`(**不是** title) |
|
||||||
|
| 模式 | 单件模式 `type='single'` 绕开变种 |
|
||||||
|
| 图片 | `mainImages`(原脚本把主图+详情图全量塞入 → 已加过滤器) |
|
||||||
|
| 重量 | 字段单位 **KG**,输入是**克** → 必须 `g/1000` |
|
||||||
|
| 尺寸 | 原用重量推算(`W = weight×1.3`)→ 必须改 1688 实抓 |
|
||||||
|
|
||||||
|
**Ozon**
|
||||||
|
| 字段 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| 价格 | **CNY**;`variantList[].price`(原价) / `salePrice`(售价),**售价必须<原价** |
|
||||||
|
| 保存 | 按钮是「保存并移入待发布」 |
|
||||||
|
| 在线口径 | 返回**合并组**:`productNum/count` 才是子商品数 |
|
||||||
|
|
||||||
|
> ⚠ **Ozon 没有建品脚本**:`~/ozon*` 只有 `ozon定价/`(算价)与 `ozon改价/ozprice_set.mjs`(**只写「价格/原价」两个字段**,入口 `/web/ozonProduct/edit?id=<pid>`,原价 = 售价×1.2 向上取整 2 位,且**唯一有 API 级回读**:`GET /api/ozonProduct/add.json?id=<pid>` → `variantList[].price/.salePrice`)。
|
||||||
|
> 全盘 find 无 `ozon建品` 目录 → **Ozon 字段清单无法从代码抽取,要补必须先写脚本**。
|
||||||
|
|
||||||
|
### 4.3 跨平台字段名对照表 ★★(同一语义,8 个平台叫法完全不同)
|
||||||
|
|
||||||
|
| 语义 | SMT 速卖通 | Shopee | SHEIN | Temu | Joom | aliChoice | Walmart | TikTok |
|
||||||
|
|---|---|---|---|---|---|---|---|---|
|
||||||
|
| 标题 | DOM「产品标题」 | `…ProductStore.title` | `sheinAddProductStore.productName` | `temuAddProductStore.productName` | `smtChoiceAddBasicStore.name` | `smtChoiceAddBasicStore.subject` | `walmartProductStore.productName`(+DOM) | `tiktokGlobalAddProductStore.productName` |
|
||||||
|
| 描述 | CKEditor `setData` | `…descriptionInfo.{descriptionText,descriptionHtml}` | — | — | `smtChoiceAddBasicStore.description` | `smtChoiceAddStore.describeInfoData.detail`+CKEditor | `walmartDescStore.description`(+DOM) | `…AddProductStore.description` |
|
||||||
|
| 卖点 | 并入描述 | 并入 descriptionText | — | — | 并入 description | 并入 detail | `walmartDescStore.keyFeatures` | `…AddProductStore.keyProductFeatures` |
|
||||||
|
| 搜索词/标签 | 并入「Keywords:」 | 并入 descriptionText | — | — | `smtChoiceAddBasicStore.tags` | — | — | `…AddProductStore.searchTerms` |
|
||||||
|
| 价格 | DOM「零售价格」 | DOM「价格」←`price_cny` | `sheinSkuDataStore.skuDataList[i].skcRetailPrice` | `temuAddSkuDataStore…skuDataList[i].suggestedPrice` | `joomAddPriceStore.price` | `smtChoiceSkuDataStore…skuDataList[i].skuPrice` | `walmartPriceShippingStore.price`(+DOM) | SKU 表列「本地展示价」←`price_myr` |
|
||||||
|
| 供货/成本 | — | — | `…supplyPrice` | `…supplierPrice` | 仅 declaredValue | — | — | — |
|
||||||
|
| 货值/报关 | DOM「货值」 | — | — | — | `joomAddPriceStore.declaredValue` | — | — | — |
|
||||||
|
| 库存 | DOM「库存数量」 | DOM「库存」 | `…stockVariety` | (SKU 行无) | `joomAddPriceStore.inventory` | — | `walmartPriceShippingStore.inventory`(+DOM) | SKU 表列「库存」 |
|
||||||
|
| 重量 | DOM「重量(kg)」+「包装后重量」 | DOM「重量」←`weight` | `…skuDataList[i].weight` | `…weight`/`.netWeight` | — | `…packageWeight` | `walmartPriceShippingStore.shippingWeight`←`weight_lbs`(+DOM 运输重量) | DOM「重量」←`weight` |
|
||||||
|
| 尺寸 | placeholder 长/宽/高 +「包装后尺寸」 | placeholder 长/宽/高←**重量推导** | `…length/width/height` | `…length/width/height` | — | `…packageLength/Width/Height` | (**未写**;`dimsToInch` 备而未用) | placeholder 长/宽/高←**重量推导** |
|
||||||
|
| 品牌 | `smtAddAttrStore.dynamicFormData[品牌id]='history-…'` | — | 必填属性兜底 | — | 必填属性兜底 | 必填属性兜底 | `walmartAttrStore.brand`+DOM | — |
|
||||||
|
| 产地 | `dynamicFormData[产地id]='history-…'` | — | 必填属性选「中国/China」 | `temuAddProductStore.productOrigin='CN'`+`region2Id` | — | 必填属性兜底 | — | — |
|
||||||
|
| 类目 | `smtAddBasicStore.categoryId`(弹窗) | `input[placeholder="搜索分类名称"]` | 同左→`sheinAddBasicStore.categoryId` | 同左→`temuAddBasicStore.categoryId` | `.ant-select-selector` 可搜索 | 弹窗 | `.ant-select-selector` **可滚动**下拉全等 | 弹窗 |
|
||||||
|
| SKU/货号 | — | — | `…skcSupplierCode`(`SHEIN-001`) | `…extCode`(`TM-<pid>-<n>`) | `smtChoiceAddBasicStore.parentSku`(`JM-<pid>`) | `…skuCode`(`AC-<pid>-<n>`) | `walmartProductStore.sku`(`WM-<oid>`) | SKU 表列「SKU」(`AM-<oid>`) |
|
||||||
|
| EAN/UPC | — | — | — | `…skuDataList[i].code`(**自算 EAN-13**) | — | — | `productId`←`ean`,`productIdType` | — |
|
||||||
|
| 主图 | `smtAddProductStore.imageList` | `shopeeGlobalImageInfoStore.$state.imageInfo.mainImages` | `sheinImgStore.mainImgData.multipleSpuImgs` | `temuAddProductStore.mainImage` | `joomAddImageStore.imageList` | `smtChoiceAddProductStore.mainImage` | `walmartImgStore.mainImage` | `tiktokGlobalImgStore.$state.formState.mainImage` |
|
||||||
|
| 素材/详情图 | 并入 imageList | 并入 mainImages | — | `.materialImage`+`packageFormState.packageImages` | `.detailImageList[0].images` | — | (`walmartPackStore` 未用) | — |
|
||||||
|
| 变种/规格 | — | `type='single'`(绕开变种) | `.theme-select-item`+`.sku-option`(**上限 3 规格**) | `.theme-value-add`+`temuAddSkuAttrStore.skuAttrs` | — | 原生 select「SKU分类」 | `hasVariant=false` | 「变种属性」`input[class*="!w-200"]`+「添加」 |
|
||||||
|
| 来源URL | — | DOM「来源URL」 | — | — | — | — | (已确认存在,待接) | DOM「来源URL」 |
|
||||||
|
| 物流属性 | `smtAddProductStore.specialProductTypeList`(**直赋**) | — | — | — | — | 报错→`.icon_edit2`→勾「普货」(UI) | — | — |
|
||||||
|
| 运费/包装 | 运费模板/服务模板/是否原箱/含关税 | — | — | `packageShape=1`、`packageType=0` | `shipping='0'`、`msrp=''` | — | — | — |
|
||||||
|
|
||||||
|
**落点分两类(决定改字段该走 store 还是走 UI)** ★★
|
||||||
|
- **① 强一致,可 `$state` 直赋**:SHEIN/aliChoice/Temu 的 SKU 行、SMT 的 `dynamicFormData`/`specialProductTypeList`、**全部平台的图片数组**。
|
||||||
|
- **② 必须走 DOM / 真实鼠标**:Temu 变种值(`tmbatch.mjs:57` 注释明写"直改 store 无效")、Temu SKU 预览图(DOM click 打不开下拉)、SMT 描述(必须走 CKEditor 实例)、aliChoice 物流属性(必须走"先保存逼出报错→编辑弹窗")、**所有平台的分类弹窗**。
|
||||||
|
- 反例(可直改已建草稿):`tm_fixean.mjs:21-25` 证明编辑页 `skuDataList[i].code` 仍可直赋。
|
||||||
|
|
||||||
|
### 4.4 硬编码清单(全部"待改",按平台)★★
|
||||||
|
|
||||||
|
| 平台 | 硬编码项 |
|
||||||
|
|---|---|
|
||||||
|
| 速卖通 | 店铺 `4024039`;零售价 **1.99** / 货值 **0.50** / 库存 100;重量 **0.02kg** ×2;尺寸 **10/5/3**(两处);物流属性 `['1983471271:2025103']`;品牌/产地/化学品 id `201512802/9441741844/23399591357`;是否原箱=否;含关税=不含;运费模板默认 `MY beauty 30g+1美金` |
|
||||||
|
| Shopee | 店铺 `Ljbgkj`;`type='single'`;库存 999;**类目关键词恒回退 `Accessories`** |
|
||||||
|
| SHEIN | 库存 999;SKU 重量/长/宽/高 **100/200/150/30**;尺码表 **10,18,3,2,18,5**;前缀 `SHEIN-`;价默认 12.90;供货价默认 8.50;**规格上限 3**;产地=中国 |
|
||||||
|
| Temu | 店铺 ①Alimingpro;省份 `43000000000002`;`productOrigin='CN'`;`packageShape=1`/`packageType=0`;变种 `['Black','One Size']`;SKU 尺寸 **20/15/3**;重量/净重 **100/90**;EAN 前缀 `69803093` + 起始 3448;价默认 19.90;成本默认 10 |
|
||||||
|
| Joom | 库存 999;`shipping='0'`;`msrp=''`;前缀 `JM-`;价默认 19.90;报关默认 10;**详情图语言=英语**;跳过 pid `676236596821,601964534137` |
|
||||||
|
| aliChoice | `packageWeight=100`;尺寸 **20/15/3**;前缀 `AC-`;价默认 19.90;`valueFor` 全部兜底;`['单品单件','件/个']`;普货;跳过 pid |
|
||||||
|
| Walmart | 店铺 `Snowmountain`;`hasVariant=false`;**`productIdType='UPC'`**(但 `IN.ean` 是 13 位 EAN);前缀 `WM-`;品牌默认 **`Generic`**(应为无品牌);库存 999 |
|
||||||
|
| TikTok | 店铺语义 `AutoMavenShop_MY`;变种默认 `'Default'`;库存 999;描述 style 串;前缀 `AM-`;来源URL 模板 |
|
||||||
|
| Ozon(改价) | 原价 = 售价 × 1.2,向上取整 2 位 |
|
||||||
|
|
||||||
|
### 4.5 建品脚本的输入源矩阵(谁读哪个文件)★★
|
||||||
|
|
||||||
|
| 输入文件 | 消费者 | 键 |
|
||||||
|
|---|---|---|
|
||||||
|
| `tiktok建品/tk_input.json`(48 条) | TikTok / Shopee / SHEIN / Temu / Joom / aliChoice(**6 个平台共用**) | 实测恰好 11 键:`title, bullets, keywords, imgs, cost, weight, price_cny, price_myr, guess, cat_kw, cat_fb` |
|
||||||
|
| ↑ **缺键后果** | Shopee 要 `sp_kw`/`sp_fb` → **0/48 命中 → 类目恒 `Accessories`**;无 `ean` → Temu **自造 EAN-13** | — |
|
||||||
|
| `walmart建品/wm_input.json`(46 条)+ `wm_cats.json`(152 类目) | Walmart | `title, bullets, keywords, imgs, weight(克,未用), ean, pc(未用), cat_index, cat, price_usd, weight_lbs` |
|
||||||
|
| `/tmp/en_all.json` + `/tmp/wm_clean.json` + `/tmp/all48.json` | 速卖通 | title/bullets/keywords;图片 URL 数组;仅用 keys |
|
||||||
|
| `shein_route.json` / `temu_route.json` / `alc_route.json` / `joom_route.json` | 各自平台 | 类目/店铺路由 |
|
||||||
|
| `ean_cursor.json` + `ean_temu_used.txt` | Temu | **EAN 游标,必须落盘防撞号** |
|
||||||
|
|
||||||
|
**⚠ 两个 EAN 体系互不相通**:Temu 用 `69803093`+4 位流水自造;Walmart 用 `wm_input.json[oid].ean`。
|
||||||
|
**⚠ `IN.weight`(克)在 SMT/SHEIN/Temu/aliChoice 4 个平台完全没被读取**;`IN.guess` 全平台 0 命中。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 单位 / 币种 / 长度口径(最高频事故区)
|
||||||
|
|
||||||
|
### 5.1 单位 ★★
|
||||||
|
| 量 | 源口径 | 目标平台口径 | 换算 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 重量 | 1688:**`unitWeight`=kg / `pieceWeightScaleInfo[].weight`=g(两个字段并存)**;`unitWeight=0` 是"未填"不是零重;下游 `IN.weight` 多为硬编码占位 —— 详见 §1.5 | TikTok/Shopee **KG**;Walmart **lb**;Temu 重量+净重(g/kg) | `kg = g/1000`;`lb = kg×2.2046226`;`gToPound` 已有 |
|
||||||
|
| 尺寸 | 1688 `pieceWeightScaleInfo[].length/width/height` = **cm**(⚠ 9/17 样本为 0) | Walmart **inch**;Temu 尺寸图 cm/inch 双标 | `inch = cm/2.54` |
|
||||||
|
| 净重 | 需 ≤ 毛重 | Temu:**净重必须小于重量**(否则保存被拒) | 需估算或人工 |
|
||||||
|
|
||||||
|
**已发生过的真实事故**:Shopee 把 `130(g)` 直接写成 `130 KG`;尺寸用重量推算得出 `169×101×34 cm`(★★ 需求 §3.5)。
|
||||||
|
|
||||||
|
### 5.2 币种 ★★
|
||||||
|
| 平台 | 币种 | 换算线索 |
|
||||||
|
|---|---|---|
|
||||||
|
| Ozon | **CNY** | 价格带 0–1500₽ ≈ 0–113¥(≈13.27₽/¥) |
|
||||||
|
| TikTok | **MYR** | MYR ≈ CNY × 0.60 |
|
||||||
|
| Shopee | **CNY** | — |
|
||||||
|
| Walmart | USD | — |
|
||||||
|
| USD 通用 | — | `USD = CNY ÷ 6.68525`(店小秘 `siteAndUsCurrencyRate`) |
|
||||||
|
| KZT(哈萨克线) | KZT | `KZT_PER_CNY = 66.84` |
|
||||||
|
|
||||||
|
### 5.3 长度上限
|
||||||
|
| 平台 | 上限 | 证据强度 |
|
||||||
|
|---|---|---|
|
||||||
|
| Walmart | **100** | ★★ 需求 §3.9 实测(改写 9 条、超限 0、触发长度兜底 1 条) |
|
||||||
|
| Temu | **120** | ★★ 需求 §3.9 |
|
||||||
|
| 其他平台 | 脚本里有 `slice(0, 60/90/110/120/150/160/170)` | ❓ **多为日志截断,不等于平台上限**,接规则前须逐平台确认 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 词表与过滤规则 ★★(`lib/listing-rules.mjs`,已单测)
|
||||||
|
|
||||||
|
| 常量 | 内容 | 用途 |
|
||||||
|
|---|---|---|
|
||||||
|
| `BRAND_DEFAULT` | `无品牌` | 全平台默认品牌 |
|
||||||
|
| `NARROW_WORDS` | boy/boys/girl/girls/children/child/kids/kid/school/teen/teenager/toy/toys/student/baby/babies/infant/toddler(25 词) | 窄义(儿童/学生)词 |
|
||||||
|
| `RISK_WORDS` | 中文侵权(侵权/仿/高仿/同款大牌/假货/A货/精仿/原单/山寨/盗版)+ 英文仿冒(replica/fake/knockoff/counterfeit/inspired by/same as/dupe/oem/authorized)+ 硬违禁(weapon/knife/gun/ammo/drug/cbd/medicine/cure/treatment/medical grade/fda approved/antibacterial/sterilize/virus/covid)+ 促销词(best price/hot sale/free shipping/buy now/discount/promotion) | 侵权/违禁 |
|
||||||
|
| `PLATFORM_RULES` | walmart `{narrow:true,risk:true}`;temu `{narrow:false,risk:true}`;smt/alichoice/tiktok/shopee/shein/joom/ozon `{narrow:false,risk:true}` | 各平台过滤集 |
|
||||||
|
| `SYNONYMS`(策略 B 同义替换) | `for kids/children/girls/boys` → `for Ages 3+`;`kids…` → `Ages 3+`;`toys` → `Party Favors`;`toy` → `Party Favor`;`students` → `Learners`;`school(s)` → `Everyday`;`teens/teenagers` → `Ages 12+`;`babies/baby/infant(s)/toddler(s)` → `Ages 0+` | 保搜索语义 |
|
||||||
|
| 约束 | 替换目标**自身不得命中**词表(`synonymSelfCheck()`);连续年龄段折叠成一个;**超长自动退回硬删再截断** | 防"换皮继续违规" |
|
||||||
|
| `filterTitle(title, platform, {mode, maxLen})` | `replace`(默认)/`strip` | 标题 |
|
||||||
|
| `filterDescription(html, platform)` | 只过滤文本节点,标签不动 | 描述 |
|
||||||
|
| `cmToInch / kgToPound / gToPound / dimsToInch / declaredValue` | 换算与货值一致 | §5 |
|
||||||
|
| `filterProductImages(urls, min=4)` | 按 `DETAIL_IMG_RE = /\/img\/ibank\/\d{4}\/\d{1,3}\/\d{1,3}\//`(拍摄日期目录 = **详情卡**)剔除;不足 4 张补回并标 `warn` | 图片卫生 |
|
||||||
|
|
||||||
|
**实测效果**(48 条真实标题):Walmart 改写 9 条、最长 100;Temu 改写 9 条、最长 106;TikTok 0 条(不过滤窄义词)。
|
||||||
|
|
||||||
|
**⚠ 接线状态(grep 实证)**:**没有任何线上建品脚本 `import` 这个规则库**(工作副本 `platform-wmt/`、`platform-temu/`、`platform-tkt/` 三份是补丁版,尚未同步进线上 `~/<平台>建品/`)。后果:
|
||||||
|
- `filterProductImages()` 的 `keep` **没接回** `IN.imgs` 消费点 → 各平台仍上传**未过滤的原始图数组**(含详情卡/儿童 stock 图);
|
||||||
|
- `cmToInch/kgToPound/declaredValue/dimsToInch` 全部备而未用 → 于是出现「速卖通货值 0.50 vs 售价 1.99」(`declaredValue` 本可拦住)、「Walmart 的 `weight_lbs` 只能在输入文件里预先算好」。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 图片与视频规范
|
||||||
|
|
||||||
|
| 项 | 规范 | 证据 |
|
||||||
|
|---|---|---|
|
||||||
|
| 写法 | **全部外链**(alicdn 等),对象形如 `{url, imgUrl, name, width, height(, checked)}`,多数平台存**数组** | ★★ |
|
||||||
|
| 例外 | Walmart 必须走「网络图片」UI,落成 `\|` 分隔字符串;Temu `mainImage` 是 `\|` 分隔外链串且**能落库** | ★★ |
|
||||||
|
| 禁含 | **中文、促销字样、水印、联系方式**(平台会删/拒) | ★★ |
|
||||||
|
| 主图 vs 详情图 | 1688 `IN.imgs` **混装**;上传前过 `filterProductImages()`;实测 48 商品 279 图里 12 张是详情卡 | ★★ |
|
||||||
|
| 儿童/模特图 | 含儿童的 stock 图在 Walmart/Temu 属高风险,一并剔除;模特图经 rembg 后模特仍在,不能当白底图 | ★★ |
|
||||||
|
| 白底图 | FlairGS `POST /api/white-bg`,**800×800 / 3.6s**,rembg 路线,不依赖 Forge ✅ 可用 | ★★ |
|
||||||
|
| 场景图 | flux `POST /api/generate-scene`(768×1024 / 66–76s)技术可用但**构图不合格**;forge 引擎 HTTP 500/503 ❌ | ★★ |
|
||||||
|
| 去水印/去中文 | 依赖 Forge,当前 503 ❌ | ★★ |
|
||||||
|
| 尺寸图 | Temu 第 4 张必须是 **cm/inch 双标尺寸图** | ★★ |
|
||||||
|
| SHEIN 特有 | `squareImage`(方图)+ `mainImgData.{multipleSpuImgs, singleSpuImg}`,且页面有「新版/旧版图片」模式开关 | ★★ |
|
||||||
|
| 视频 | 速卖通(`video/videoUrl/installVideo`)、TikTok(`videoUrl/videoId/videoPostUrl`)均有槽位,**当前未填** | ★★ |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 变种/变参体系(当前最弱的一环)
|
||||||
|
|
||||||
|
| 平台 | 现状 | 目标 |
|
||||||
|
|---|---|---|
|
||||||
|
| 速卖通 | **无变参**(`smtProductSkuList` 未填) | 建变参(颜色/尺码)+ 变参图 |
|
||||||
|
| TikTok | 只填了变种属性值;**变种主题图未完成**(字段候选已列出) | 每个变种主题挂图 |
|
||||||
|
| Walmart | `hasVariant=false`(**变参被关掉**) | 开启变参 + 逐变参隔离图片 |
|
||||||
|
| Temu | SKU 行已建(含尺寸/重量/净重),变种属性靠 UI `.theme-value-add` | 已完成主体 |
|
||||||
|
| 通用字段 | `variantTheme, option1/2/3(+Value), variantList[], skuDataList[], variantImageIdMap, variationListStr` | — |
|
||||||
|
|
||||||
|
**硬规则**:变参图**只能有当前变参的图,不能串图**(TikTok #4 / Walmart #7 / 速卖通 #8)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. 合规与平台特有硬性要求(逐条可验收)
|
||||||
|
|
||||||
|
| # | 平台 | 要求 | 状态 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 1 | 速卖通 | 类目必须与店铺(4024039)授权类目对应,不得猜 | ❌ 待做(白名单) |
|
||||||
|
| 2 | 速卖通 | 标题用平台热词/长尾词(接 LLM) | ❌ 待做 |
|
||||||
|
| 3 | 速卖通 | 星号必填逐项填(产地/高关注化学品,类目有差异) | ⚠ 写死 id |
|
||||||
|
| 4 | 速卖通 | 主图无中文/促销字;一键生成白底(1:1)/场景(3:4)图 | ⚠ 白底可用、场景不合格 |
|
||||||
|
| 5 | 速卖通 | 产品视频 | ❌ 未填 |
|
||||||
|
| 6 | 速卖通 | 零售价与货值一致 | ⚠ 硬编码 1.99/0.50 |
|
||||||
|
| 7 | 速卖通 | PC/无线端描述带图 + 规范 HTML | ❌ 纯文字 |
|
||||||
|
| 8 | 速卖通 | 变参与变参图 | ❌ |
|
||||||
|
| 9 | 速卖通 | 来源 URL | ❌ |
|
||||||
|
| 10 | TikTok | 多国勾选 + 复制到其他店铺「全选」 | ✅ `siteIds` 已验证 |
|
||||||
|
| 11 | TikTok | 品牌=无品牌 | ✅ |
|
||||||
|
| 12 | TikTok | 描述含产品图 | ✅ |
|
||||||
|
| 13 | TikTok | 变种主题图 | ❌ |
|
||||||
|
| 14 | TikTok | 长/宽必填 | ✅ 回读 130/78/26 |
|
||||||
|
| 15 | TikTok | 货到付款 | ✅ `isCodOpen=1` |
|
||||||
|
| 16 | TikTok | 类目白名单 | ❌ |
|
||||||
|
| 17 | Walmart | 来源 1688 URL | ❌ |
|
||||||
|
| 18 | Walmart | 标题/描述过滤窄义词 | ✅ 已接 |
|
||||||
|
| 19 | Walmart | 标识符 = **ISBN** | ✅ 保存级验证 |
|
||||||
|
| 20 | Walmart | 品牌 = 无品牌 | ⚠ 批量里 store/checked 不一致,待编辑页确认 |
|
||||||
|
| 21 | Walmart | Country of Origin = China | ❌ |
|
||||||
|
| 22 | Walmart | 尺寸→英寸、重量→英镑 | ⚠ 重量已 lbs,尺寸未处理 |
|
||||||
|
| 23 | Walmart | 变参图隔离 | ❌(变参本身被关) |
|
||||||
|
| 24 | Temu | 标题过滤违禁/侵权 | ✅(本批无命中) |
|
||||||
|
| 25 | Temu | 图片无中文;第 4 张 cm/inch 尺寸图 | ❌ |
|
||||||
|
| 26 | Temu | 产品描述 | ✅ 已写 `describeInfoData` |
|
||||||
|
| 27 | Shopee | 剔除详情图(工厂照/证书/流程图/退货/FAQ) | ✅ `filterProductImages()` |
|
||||||
|
| 28 | Shopee | 重量克→千克 | ⚠ 已识别,待接线 |
|
||||||
|
| 29 | SHEIN | 图片落库 | ❌ **写 store 不进保存载荷** |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 校验与回读(验收口径,不接受的写法)
|
||||||
|
|
||||||
|
**教训(`建品质量需求.md` §3.11 原话)**:**回读校验必须断言"字段非空且与期望相等",只查"没有禁词"会自欺。**
|
||||||
|
第一版回读读的是 `hit.name`,而 Walmart 列表里标题字段叫 **`productName`** → "没找到字段 → 空串 → 判定无禁词"成了**假阳性**。
|
||||||
|
|
||||||
|
| 平台 | 回读接口 | 关键字段 | 判据 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| Walmart | `POST /api/walmartProduct/pageList.json` | `productName / platformTitle / mainImage / productIdType` | 标题**精确相等** + 图片非空 |
|
||||||
|
| Temu | `POST /api/pddkjProduct/pageList.json`(模块名是 pddkjProduct) | `productName` | 精确相等 ✅ |
|
||||||
|
| SHEIN | `POST /api/sheinProduct/pageList.json` + `shopId=-1&dxmState=offline&productSearchType=1`(**没有** `dxmOfflineState`) | `mainImage` | 非空(用错参数 totalSize=0 会误判"没建成") |
|
||||||
|
| 通用 | `POST /api/<模块>Product/pageList.json` | `data.page.list` | — |
|
||||||
|
|
||||||
|
**通用铁律**
|
||||||
|
1. **写 store ≠ 落库**:SHEIN 三个图位全写住仍 `mainImage:""`;Walmart `mainImage` 同类问题(一次保存全过程 22+ 条 `/api/` 请求**没有任何图片上传接口**,最终 POST 载荷仅 12 字节)→ 必须抓保存 POST 载荷判断"没进载荷"还是"要走上传递交"。
|
||||||
|
2. **`idStr ≠ id`**:大整数在 JS 里丢精度,服务端操作(删除/详情)一律用 `idStr`。
|
||||||
|
3. **"点保存没反应"先挂钩子**:校验报错被 `MYJ.message.error` 吞掉,且**层层递进**(修完 A 才显示 B)。
|
||||||
|
4. **改 store 后校验仍失败**:UI 异步同步,**再点一次保存**可能就过。
|
||||||
|
5. **类目不能猜**:必须与店铺授权类目对应,无匹配**跳过不硬选**。
|
||||||
|
6. **跑之前先查重**:否则重试会产生重复(本会话踩过同一商品建 3 份)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. 我们自己的落库结构(`products.listings`)★★★
|
||||||
|
|
||||||
|
```js
|
||||||
|
{
|
||||||
|
source: "dianxiaomi" | "miaoshou", // 同一集合双来源
|
||||||
|
platform: "ozonProduct", // 接口模块名
|
||||||
|
platformName: "Ozon", // 展示名
|
||||||
|
state: "waitPublish" | "publishFail" | "online",
|
||||||
|
stateName: "待发布",
|
||||||
|
docKey: "184807701684308597", // idStr → productId → mergeId → 兜底哈希
|
||||||
|
title, shopId, platformProductId,
|
||||||
|
price, currency, categoryId, categoryName,
|
||||||
|
mainImage, errMsg,
|
||||||
|
createTime, updateTime,
|
||||||
|
childCount: 3, // 合并组/变种子项数
|
||||||
|
syncedAt, firstSeenAt, runId, gone, goneAt,
|
||||||
|
raw: { ...原始 item... } // ★ 平台字段全量在这
|
||||||
|
}
|
||||||
|
```
|
||||||
|
索引:`uniq_listing(source, platform, state, docKey)`、`by_state`、`by_synced`、`by_title`(text);同步账本 `products.sync_runs`。
|
||||||
|
|
||||||
|
**口径铁律**:**Ozon / Walmart 的「在线」返回的是合并组,不是子商品** —— 统计要用 `ΣchildCount`(Ozon 在线:组 2,593 → 子商品 20,415;Walmart:组 1,068 → 2,090)。分页行数不等长且会重复返回,脚本按 `docKey` 去重。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 12. 妙手(miaoshou)侧
|
||||||
|
|
||||||
|
**平台 key → 名称**(`sync_msp_listings.py`:`ITEM_KEYS` **22 个**是接口实测认的键;`PLATFORM_NAMES` **39 个**另含授权页专用键 —— `*Choice/*Gs/*Scs/*Fc/*Local` 这类**item 接口不认、会返回 HTML**):
|
||||||
|
`pddkj`Temu全托管 · `pddkjChoice`Temu半托管 · `pddkjLocal`Temu本土 · `shopee` · `shopeeScs`Shopee全托管 · `shopeeSwarm`Shopee轻出海 · `tiktok` · `tiktokGs`TikTok全托管 · `lazada` · `lazadaChoice` · `ozon` · `yandex` · `wildberries` · `aliexpress` · `aliexpressChoice`速卖通半托管 · `aliexpressFc`速卖通全托管 · `aliexpressLocal`速卖通本土POP · `aliexpressOverseas`速卖通海外托管 · `amazon` · `coupang` · `alibaba` · `wish` · `shopify` · `daraz` · `joom` · `allegro` · `qoo10` · `shoplazza` · `jumia` · `walmart` · `shopline` · `shein` · `sheinChoice`SHEIN半托管 · `emag` · `noon` · `miravia` · `joybuy` · `mercado`Mercado Libre
|
||||||
|
|
||||||
|
**妙手的状态机**:只有 `waitPublish`(采集箱未发布)/ `online`(发布成功)两态。
|
||||||
|
|
||||||
|
#### 12.1 接口信封(实测确认)★★★
|
||||||
|
| 接口 | 关键参数 | 响应键 |
|
||||||
|
|---|---|---|
|
||||||
|
| `POST /api/auth/shop/getShopList` | `pageNo,pageSize,platform,includeShopeeGlobal=0,excludeShopeeCnscShop=0`(**缺后两个报「页码数据有误」**) | `shopList[]`(取 `shopId`/`id`) |
|
||||||
|
| `POST /api/platform/<key>/item/item/searchItemList`(**在线**) | `titleType=multi` + **必须带 `shopIds[i]`**(否则「没有符合条件的记录」) | `{result,itemList,total}` |
|
||||||
|
| `POST /api/platform/<key>/move/collect_box/searchCollectBoxDetail`(**待发布**) | `claimPublishShopStatus=published&titleType=multi&remarkType=multi&status=notPublished` | `{result,detailList,total}` |
|
||||||
|
| `POST …/collect_box/getTabCountStatMap` | — | `{count,notPublishedCount,publishedCount,timingPublishCount,aiOptimize*}` |
|
||||||
|
| 错误 | — | `{result, reason}`(`reason` 即错误文案) |
|
||||||
|
|
||||||
|
边界:**yandex 回 HTTP 200 + 空体** = 无此功能,脚本按 `_empty` 处理,不报整轮错误。
|
||||||
|
|
||||||
|
#### 12.2 入库字段映射(`source='miaoshou'`)★★
|
||||||
|
| 字段 | 取值候选(按序) | 备注 |
|
||||||
|
|---|---|---|
|
||||||
|
| `docKey` | `collectBoxDetailId`→`itemId`→`id`→`sourceItemId`,兜底 `'h'+hash(item)` | 幂等唯一键 |
|
||||||
|
| `title` | `title`→`itemName`→`name`→`productTitle`→`itemNum` | |
|
||||||
|
| `shopId` | `shopId` / `authShopId` | |
|
||||||
|
| `platformProductId` | `platformItemId` | |
|
||||||
|
| `price` | **`salePrice`(非空优先)** → `price` → `minSkuPrice` | ⚠ **与店小秘顺序相反**(店小秘 `price`→`salePrice`) |
|
||||||
|
| `currency` | `currency` / `sourceCurrency` | |
|
||||||
|
| `categoryId` | `cid` / `categoryId` | |
|
||||||
|
| `categoryName` | **硬编码 `None`** | 妙手侧未取 |
|
||||||
|
| `mainImage` | `picUrl` / `listThumbnail` / `thumbnail` | |
|
||||||
|
| `errMsg` | `reason` | |
|
||||||
|
| `createTime`/`updateTime` | `gmtCreate`/`ts`;`gmtModified` | |
|
||||||
|
| `childCount` | **硬编码 `None`** | 妙手无合并组映射 |
|
||||||
|
| `raw` | 原始 item 全量 | 保底 |
|
||||||
|
> ⚠ 上表 API 侧键名来自脚本 `first_of` 候选列表("脚本认为可能存在");**能确证有值的只有信封的 `total/itemList/detailList`**。
|
||||||
|
|
||||||
|
#### 12.3 妙手平台与计数(`msp-platforms.json` / `msp-collectbox.json`)★★★
|
||||||
|
| 平台键 | 店铺 | 采集箱 count | 待发布 | 已发布 | 在线 |
|
||||||
|
|---|---:|---:|---:|---:|---:|
|
||||||
|
| **pddkj**(Temu全托管) | **14** | 46 | **45** | 1 | **55,462** |
|
||||||
|
| **tiktok** | 0 | 4,341 | **2,744** | 1,597 | — |
|
||||||
|
| **shopee** | 0 | 170 | **37** | 133 | — |
|
||||||
|
| **shein** | 0 | 44 | **44** | 0 | — |
|
||||||
|
| **ozon** | 0 | 1,555 | 0 | 1,555 | —(无店铺,在线同步不了) |
|
||||||
|
| 其余 16 键 | 0 | 0 | 0 | 0 | — |
|
||||||
|
|
||||||
|
- 有「待发布」数据:`pddkj 45 + shopee 37 + tiktok 2744 + shein 44 = **2870**`
|
||||||
|
- 有「在线」数据:**仅 pddkj = 55,462**
|
||||||
|
- ⚠ **口径冲突**:pddkj 采集箱「已发布」只有 1,而在线 55,462;ozon 采集箱「已发布」1,555 却无店铺 → **采集箱「已发布」≠ 产品管理「在线」,勿混用**。
|
||||||
|
- ⚠ `msp-platforms/collectbox/shops.json` **三个 JSON 是孤儿快照**(`sync_msp_listings.py` 不读它们,生成脚本未找到)。`msp-shops.json` 是空 `{}`。
|
||||||
|
|
||||||
|
#### 12.4 妙手刊登/导入参数(有来源)★★
|
||||||
|
| 参数 | 内容 | 来源 |
|
||||||
|
|---|---|---|
|
||||||
|
| **导入「链接采集」8 列 `.xls`** | `产品主编号`(1688 id,**必须**)、`链接地址(必填)`、`产品标题`、`货币类型`(**必须**,空报「不允许此货币类型」)、`SKU售价`(**必须 ≥0.01**)、`SKU库存`(**必须 ≥0**)、`价格(RMB)`、`促销价(RMB)` | `~/miaoshou/RECIPE.md`(实测解析 **47/0/47**) |
|
||||||
|
| 页面下载的官方模板 | 仅 **4 列**(`链接地址/产品标题/价格(RMB)/促销价(RMB)`),**缺 `产品主编号` → 照它填必失败** | 同上 |
|
||||||
|
| ⚠ 文档矛盾 | `archived/miaoshou-batch-import`(2026-04) 断言「严格 5 列,**绝不能加** `产品主编号`」;`RECIPE.md`(2026-09-21) 实测「**必须加**」 → **以 09-21 的 8 列为准**(服务端模板已演进) | — |
|
||||||
|
| 采集箱编辑弹窗 Tab | `基本信息 / 产品属性 / 销售属性 / 产品图片 / 产品视频 / 认证说明 / 物流信息 / 货源链接`(容器 `.collect-box-editor`) | `archived/miaoshou-collect-box`(369 行) |
|
||||||
|
| 标题 / 产品主编号 / 简易描述 / 详细描述 | 标题 `input[type=text]`;主编号 `input[1]`(placeholder「不填将自动生成」);**简易描述 `textarea[0]`** → 用于 **Shopee/Wish/Joom/Mercado Libre/Ozon/Walmart**;**详细描述 `iframe[0]`(富文本)** → 用于 **Lazada/速卖通/TikTok/Coupang/eBay/Allegro** | 同上 |
|
||||||
|
| 促销价(RMB) | 表头注明「**仅可用于采集到 Lazada**」 | `RECIPE.md` |
|
||||||
|
| 采集箱筛选/动作 | 筛选:`关联货源/产品标题/货源ID/货源价格`;动作:`任务记录/认领到/平台认领配置/批量编辑/分组/删除/创建产品/导入产品/列表设置` | 同上 |
|
||||||
|
| 导入任务列表 | `文件名称/导入时间/解析状态/成功条数/失败条数/操作`(文件保留 90 天) | 同上 |
|
||||||
|
| Ozon 刊登必填 | 分类、标题(俄语)、描述、价格(¥×12~15×1.5~2)、库存、图片;店铺需 Ozon `Client ID + API Key` | `1688-to-ozon-listing-workflow` |
|
||||||
|
| Vue 状态同步 | 写值后必须 dispatch `input`/`change`/`blur`,否则点保存**静默丢弃** | `archived/miaoshou-collect-box` |
|
||||||
|
| 链接采集 URL 格式 | `URL` / `URL$$title` / `URL\|\|title` | `miaoshou-erp/SKILL.md` |
|
||||||
|
|
||||||
|
#### 12.5 妙手 vs 店小秘 关键差异 ★★
|
||||||
|
| 维度 | 妙手 | 店小秘 |
|
||||||
|
|---|---|---|
|
||||||
|
| 平台键 | 裸键 `pddkj`,**按平台分路径** `/api/platform/<key>/…` | module 名 `ozonProduct`/`smtProduct`,统一 `POST /api/<module>/pageList.json` |
|
||||||
|
| 状态机 | **2 态** | **3 态**(多 `publishFail`) |
|
||||||
|
| 在线前置 | **必须 `shopIds[i]`** | 无需 |
|
||||||
|
| 发布失败 | 无对应状态,仅 `errMsg ← reason` | 独立状态 + `errMsg/auditFailureReason` |
|
||||||
|
| ID | `collectBoxDetailId→itemId→…`,**无 idStr 概念** | `idStr→productId→mergeId`,**idStr 优先** |
|
||||||
|
| 价格键序 | `salePrice→price→minSkuPrice` | `price→salePrice`(**相反**) |
|
||||||
|
| 子商品 | **`childCount=None`** | `products/productList` 或 `productNum/count`(合并组) |
|
||||||
|
| 分页 | `PAGE_SIZE=500`(111 页 × 500 = 55,462 ✓) | `PAGE_SIZE=200`(**传 500 只回 100**) |
|
||||||
|
| 图片 | **无外链/上传字段证据**;靠「链接采集」由妙手服务端抓源页 | 建品表单**全用外链**;Walmart 例外走「网络图片」UI |
|
||||||
|
| 发布 | 未打通(子账号无发布权限) | 「保存并移入待发布」已跑通 |
|
||||||
|
| Joom | 纳入 | **默认排除 `joomProduct`** |
|
||||||
|
|
||||||
|
#### 12.6 妙手侧"无证据"清单(不编造)❓
|
||||||
|
1. **妙手各平台刊登 API 字段**(重量/尺寸/EAN/品牌/变种/类目差异)——**零证据**,无文档也无代码。
|
||||||
|
2. 是否有 `publishFail` / 定时发布状态(只有 `timingPublishCount` 计数键)。
|
||||||
|
3. `msp-shops.json` 为空;店铺只在运行时 `getShopList` 现取。
|
||||||
|
4. 妙手侧 `title/price/categoryId/mainImage` 候选键**哪些真命中**(无 raw 样本落盘)。
|
||||||
|
5. 妙手图片是外链还是上传——**未验证**。
|
||||||
|
6. 「采集并自动发布」是否真能发布——自述"待实测",权限口径有冲突。
|
||||||
|
|
||||||
|
|
||||||
|
**妙手文档字段(raw,以平台为单位)**:公共骨架高度一致,含
|
||||||
|
`collectBoxDetailId, collectBoxGroupId/Name, commonCollectBoxDetailId, platform, platformItemId, source/sourceItemId/sourceItemUrl/sourceSite/sourceShopName, sourceList[], title, thumbnail/listThumbnail, price, stock, minWeight/maxWeight, minSkuPrice/maxSkuPrice, sitePriceMap, siteAndCatMap, siteAndCidMap, shopIds, pubShopList, timingShopList, importTemplateType, copyType, dataPath, infringementDetectResult, taskProcessStatusList, status, gmtCreate/gmtModified`
|
||||||
|
平台差异:TikTok 多 `packageL/W/H, weight, siteWeightMap, isSupportReplicateProduct, *IncludeVat` 等;Shopee 多 `promotion, hasSavePrice/hasSaveSite/hasTranslate, maxOriginPrice`;Temu 多 `collectBoxDetailShopList[]{brandId, breadcrumb, cid, currency, sizeTemplateId…}`。
|
||||||
|
|
||||||
|
**与店小秘的差异**:妙手用 `collectBox`(采集箱)作为待发布容器,字段名以 `collectBox*` 前缀;店小秘用 `dxmState/dxmOfflineState` 状态位。两者都保留 `sourceItemUrl`(1688 来源)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 13. 字段可得性矩阵(能不能自动拿到)
|
||||||
|
|
||||||
|
| 字段 | L1 源 | 自动可得 | 需人工/生成 | 备注 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 标题/卖点/关键词 | ✅ | ✅ | | 需过滤 + 可 AI 优化 |
|
||||||
|
| 价格/成本 | ✅ | ✅ | | 定价公式已有 |
|
||||||
|
| 重量 | ⚠ 口径不一 | ⚠ | ✅ 校核 | 单位事故高发 |
|
||||||
|
| 包装尺寸 | ⚠ 常缺 | ⚠ | ✅ | 禁止用重量推算 |
|
||||||
|
| 主图 | ✅ | ✅ | | 必须过滤详情图/中文 |
|
||||||
|
| 白底图 | — | ✅ | | FlairGS 可用 |
|
||||||
|
| 场景图 | — | ❌ | ✅ | flux 构图不合格 |
|
||||||
|
| 视频 | ❌ | ❌ | ✅ | 需生成或人工 |
|
||||||
|
| 变种定义 | ⚠ | ⚠ | ✅ | 1688 规格 → 变种映射 |
|
||||||
|
| 变种图 | ⚠ | ⚠ | ✅ | 串图风险 |
|
||||||
|
| 品牌 | ❌ | — | 固定 `无品牌` | |
|
||||||
|
| EAN/UPC/ISBN | ❌ | ✅ | | 自建台账(S03 落账) |
|
||||||
|
| 原产国/产地 | ⚠ 供应商 | ⚠ | ✅ | 默认 China |
|
||||||
|
| HS 编码 | ❌ | ⚠ | ✅ | 类目映射 |
|
||||||
|
| 高关注化学品 | ❌ | — | 固定 `none` | |
|
||||||
|
| 说明书文件 | ❌ | ❌ | ✅ | 速卖通部分类目强制 |
|
||||||
|
| 类目 | ⚠ 猜 | ❌ | ✅ | 必须店铺授权白名单 |
|
||||||
|
| 尺码表 | ⚠ | ⚠ | ✅ | SHEIN/Shopee 需要 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 14. 待确认 / 缺口(按优先级)
|
||||||
|
|
||||||
|
**P0(正在流血)**
|
||||||
|
1. **妙手 cookie 已过期**,22 平台全 `授权已经过期`,而监控报 OK(见 §0)→ 需重登 + 修判据。
|
||||||
|
2. **SHEIN / Walmart 的 `mainImage` 不落库**(写 store 不进保存载荷)→ 需抓保存 POST 载荷定位。
|
||||||
|
3. **规则库未接线**:`filterProductImages / cmToInch / kgToPound / declaredValue / dimsToInch` 一个都没被线上脚本 import(见 §6)。
|
||||||
|
|
||||||
|
**P1(字段口径)**
|
||||||
|
4. **重量源口径未统一**:`unitWeight`(kg) vs `pieceWeightScaleInfo.weight`(g),且 `unitWeight=0` 要当缺失(见 §1.5)。
|
||||||
|
5. **`IN.weight`(克) 在 4 个平台完全没被读取**,尺寸在 Shopee/TikTok 仍是重量推导、其余平台硬编码(见 §4.4/§4.5)。
|
||||||
|
6. **两个 EAN 体系互不相通**(Temu 自造 vs Walmart 输入包),且都需回 S03 落账。
|
||||||
|
7. **各平台标题长度上限**:只有 Walmart(100)/Temu(120) 实测;其余脚本里的 `slice` 不能当上限。
|
||||||
|
|
||||||
|
**P2(能力缺口)**
|
||||||
|
8. **Ozon 无建品脚本**(只有改价)→ 要 Ozon 字段清单必须先写脚本。
|
||||||
|
9. **Temu 第 4 张尺寸图**生成方式;**场景图路线**(等 Forge 还是 txt2img+PIL 合成)。
|
||||||
|
10. **变参体系**:1688 规格 → 平台变种主题的对齐规则(含变种图隔离)。
|
||||||
|
11. **妙手各平台刊登字段**:零证据,需要一篇自己的实测(妙手侧没有对应文档)。
|
||||||
|
|
||||||
|
**P3(决策)**
|
||||||
|
12. **存量 47×8 条是否补字段**(走编辑页)还是作废重建。
|
||||||
|
13. **1688 抓取路线裁决**:BDPM curl(实测可行)vs Desktop CDP(旧技能主张)。
|
||||||
|
14. 产品库库名冲突:`premiumproducts.products` vs `productpool1.products`。
|
||||||
|
15. 失效引用清理:`1688-cross-border-sourcing` 技能引用的 `~/.hermes/scripts/1688_scrape_cdp.py` 与 `references/*` 在本机不存在。
|
||||||
Reference in new issue
Block a user