# Temu 全托管(①Alimingpro, shopId 4021529)进展 ## 已勘明 - 类目:1038 个,直接从 `temuAddBasicStore.dataState.categories` 读(不用滚动) - 选类目:下拉需**先 scrollTop=0**(默认残留上次滚动位置)→ 滚动找 `.ant-select-item-option` - 外包装形状:不规则 / 长方体 / 圆柱体 - 外包装类型:硬包装 / 软包装+硬物 / 软包装+软物 - 字段落点: - `temuAddProductStore.formState.mainImage` → **数组** - `temuAddProductStore.formState.materialImage` → **对象**(单个) - `temuAddOtherStore.packageFormState` → `{packageShape, packageType, packageImages, inventoryRegion}` - `temuAddSkuAttrStore.formState.skuAttrs` → `[{type:2,parentSpecId:1001,parentSpecName:"颜色",options:[]}]` - `temuAddSkuDataStore.formState.skuDataList` → SKU 行 - 必填 9 项:店铺/分类/标题/产地/轮播图/素材图/外包装形状/外包装类型/外包装图片 ## 未解(卡点) 1. 点「保存」不发任何 POST,且无校验红字 → 静默拦截 2. 程序化塞 `skuAttrs[0].options` **不生成** `skuDataList` 行(需走 UI) 3. 变种区只渲染出主题选择器(颜色/风格/材质…),**值输入控件没找到**;变种本身也非必填 4. `产品素材图` 在 DOM 里仍显示为空(store 已设) 5. 表单下方未发现价格/库存输入(可能随变种行生成) --- ## 更新:静默拦截已定位(用 MYJ.message.error 钩子) Temu 被吞掉的报错是**层层递进**的: 1. ~~`产地选择中国时,省份必填,请完善后提交`~~ → 已解决 路径:`temuAddProductStore.formState.region2Id`(候选在 `region2Id` 同级 `regionCode`,31 个省) 注意:直接赋值 store 当时不生效,但**异步同步后 UI 会显示「北京市」**,再点保存即通过 2. **`产品变种不能为空!`** ← 当前唯一剩下的卡点 需要真正生成变种行(`temuAddSkuDataStore.formState.skuDataList`) 程序化塞 `temuAddSkuAttrStore.skuAttrs[0].options` **无效** ## 变种区控件(待继续) - `.ant-select` #16 = 颜色主题选择器(主题候选:颜色/风格/材质/口味/…共18个) - `.ant-select` #17 = 尺码 - 未找到独立的值输入框;值控件可能随主题选中后异步渲染 --- ## 更新2:照 SHEIN 的解法推进,报错序列已剥到最后一层 Temu 的规格机制和 SHEIN **不同构**——没有 `theme-select-box`, 而是 **两个 `.theme-value-add` 块**(颜色 / 尺码),每块各有「值输入框(`input[class*="!w-200"]`) + 添加按钮」。 **值必须手动输进去再点「添加」**,程序化塞进 `skuAttrs[0].options` 完全无效。 ### 报错序列(每修完一层才露出下一层) | # | 报错 | 状态 | 解法 | |---|---|---|---| | 1 | 产地选择中国时,省份必填 | ✅ | `temuAddProductStore.formState.region2Id`(异步同步,需再点一次保存) | | 2 | 产品变种不能为空! | ✅ | 两个 theme-value-add 各输一个值点「添加」→ `skuDataList` 生成 2 行 | | 3 | 尺寸不能为0或空 | ✅ | SKU 表「尺寸(cm)」列每行有 **3 个子输入**(长/宽/高),要全填 | | 4 | 净重必须小于重量 | ✅ | 净重填 90、重量填 100(不能相等) | | 5 | **请上传预览图** | ⬜ 当前 | SKU 表「预览图」列需真实图片,不是文本 | ### SKU 表列(Temu 全托管) `预览图 | 颜色 | 尺码 | SKU货号 | EAN UPC ISBN | 申报价格(CNY) | 尺寸(cm) | 重量(g) | 净重(g) | 建议售价 | SKU分类` ⚠️ EAN 用公司台账下一段:pc 3447 起(Walmart 已用 3400~3446) --- ## 更新3:预览图已解 → **首条已保存进待发布(2026-09-20)** ### 解法(点单元格,不是点表头) 表头那个「批量」下拉是**通用图片工具**(批量传图/压缩/加水印…),跟预览图无关,别点它。 真正的入口是**单元格本身**: 1. 用**真实鼠标事件**点 `.sku-image` 单元格(`mouseMoved` → `mousePressed` → `mouseReleased`; DOM click 打不开) 2. 弹出下拉 `.myj-image-drop`:`本地图片 / 空间图片 / 网络图片 / **引用产品轮播图** / 引用采集图片` 3. 点「**引用产品轮播图**」→ 弹窗「**引用产品图片**」(列出产品轮播图,每个带「选择图片」) 4. 勾「**全部**」→ 点「**选择**」 5. 行数据出现 `image: {url, imgUrl, name, width, height}`,单元格变成真图 **关键坑:这个弹窗是「单格」的**——勾全部只作用**当前那一行**。N 行就要走 N 遍。 (`全部` = 把那 5 张轮播图都塞给这一格,单元格只显示第一张。) 现成脚本:`tmpv.mjs`(`node tmpv.mjs` 给所有 SKU 行挂图,`node tmpv.mjs 1 3` 只挂指定行) ### 结果 `/web/temu/choiceTemuList/offline`(**待发布**)搜标题命中: `Hair Clips Set for Women Girls Fashion Hair Accessories 「①Alimingpro」 ... TM-TEST-1 TM-TEST-2 CNY 12.90` 保存成功弹「您的产品已保存到「待发布」,请在待发布页完成发布!」 ### ⚠️ 路由纠正 店小秘的列表路由是 **`/draft` = 采集箱、`/offline` = 待发布**(之前搜 `/draft` 找不到东西就是这个原因)。 Temu 全托管列表 = `/web/temu/choiceTemuList/{draft|offline|online}`; Temu 半托管 POP = `/web/popTemu/pageList/*`。保存接口是 `/api/pddkjProduct/add*.json`(拼多多跨境=Temu 全托管)。 --- ## 更新4:批量完成(46/46 进待发布,2026-09-20) 脚本:`tmbatch.mjs`(`node tmbatch.mjs` 全量 · `node tmbatch.mjs ` 单条 · `--dry` 只构建) 数据:`tk_input.json` × `temu_route.json`(pid → 中文类目名 + catId),`tm_done.json` 断点续跑。 ### 单条顺序 `选店铺(①Alimingpro) → 选类目(弹窗搜索,按**最后一级路径精确匹配**,别用 contains, 否则「口哨」会选到「狗口哨」) → 标题/主图/素材图/包装图/产地(region2Id) → 变种值 (两个 .theme-value-add 各输值再点「添加」)→ 填 SKU 行(货号/EAN/价/尺寸/重量/净重) → 逐行挂预览图 → 保存` ### 这一轮新踩的坑 1. **主图必须满 5 张**,否则 `MYJ.error: 产品轮播图至少要上传5张!` → 图不够就重复补齐(`padImgs`) 2. **类目弹窗必须关掉**(同 SHEIN),否则预览图挂不上,最后只报「请上传预览图」—— 第一轮 13 条就是这么挂的,补上「关弹窗 + 预览图重试」后**全部重跑成功** 3. **EAN 游标必须落盘**:`ean_cursor.json` + `ean_temu_used.txt`。 第一轮游标只在内存里,重跑换进程后从 3449 重发,和手工首条的口哨撞了号 (`6980309334492`)→ 用编辑页 `tm_fixean2.mjs` 改成 `6980309335512`,台账已补齐、当前无重复 ### 结果 46/46 保存成功(+ 手工首条 = 47 条在待发布)。 EAN:pc **3447~3551** 已用,游标 → **3552**。 ⚠️ 台账只在 KVM-2,**尚未回 S03 `/root/ean_*.txt`**。 ### 编辑已有草稿 待发布列表里「编辑」按钮**必须用真实鼠标事件**点,而且会**新开一个标签** `/web/temu/edit?id=`(DOM click 无效,一次没关标签就会攒一堆)。