Files
dianxiaomi-crossborder-play…/alichoice建品/RECIPE.md
T

82 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# aliChoice(速卖通全托管)配方 — **已跑通**(批量进行中)
路由:`https://www.dianxiaomi.com/web/smtChoice/add` 列表:`/web/smtChoice/{draft=采集箱, offline=待发布}`
## 已经打通的(批量脚本 `alcbatch.mjs`,单条已验证保存成功)
1. **店铺**:`店铺名称` 下拉(实测 2 家:`XYZ Store` / `UniStyle Bag Store`),取第一家 → `shopId=4393191`
2. **备货类型**:下拉 `国内履约` / `海外备货` → 取第一个(→ `productType='1'`)
3. **类目**:`选择分类` 弹窗 → 用 `sh_build.selectCategory(c, cat_kw, cat_kw)`(与 SHEIN/Temu 同一套)
4. **标题** → `smtChoiceAddBasicStore.formState.subject`(⚠️ **不是 Joom 的 `name`**)
5. **主图** → `smtChoiceAddProductStore.formState.mainImage[]`(吃 `{url,imgUrl,name,width,height}`)
6. **PC端描述** → `smtChoiceAddStore.describeInfoData.detail` + **CKEditor setData**(见下)
7. **SKU 行** → `smtChoiceSkuDataStore.formState.skuDataList[]`
字段:`skuPrice / skuCode / scItemBarCode / packageWeight / packageLength / packageWidth /
packageHeight / logisticAttrListJson / logisticAttrList / imageList`
8. **必填类目属性**(品牌 / 高关注化学品 / 产地)→ `fillRequiredSelects()` 现已能自动填
(产地会输「中国」过滤后选 `中国大陆`)
## ✅ 「请选择物流属性」已解(保存两遍)
保存时钩子给 `MYJ.error: 校验失败`,DOM 里是一个**没有 label** 的报错块:
```html
<div class="ant-form-item-has-error">
<span></span><i class="iconfont icon_edit2 link ml-4"></i>
<div class="text-red-500 font-size-12 mr-[20px]">请选择物流属性</div>
</div>
```
解法(**保存两遍**):
1. 先点一次保存 → 报错块出现
2. 点报错块里的 `i.icon_edit2` → 弹出「修改物流属性」modal(20 个复选框,按大类分组:
禁运 / 普货 / 纯电 / 强磁 / 特货(液体·粉末·膏体·其他) / 特敏 / 内电(8 种电池) / 外电 / 弱磁)
3. 勾 **普货** → 点「确定」→ 再点保存 → `您的产品已保存到「待发布」`
对应 SKU 行的 `logisticAttrListJson` / `logisticAttrList` 两个字段。
## ✅ PC端描述是 CKEditor,写 textarea 没用
DOM 里那个 `TEXTAREA` 是 `display:none` 的藏匿字段,真实控件是 **CKEditor**
(aria-label「所见即所得编辑器, cked…」)。两种赋值方式,实测都写上才稳:
```js
// 1) 给编辑器实例 setData(本例 window.CKEDITOR.instances 有 2 个实例)
Object.values(window.CKEDITOR.instances).forEach(x => x.setData(html));
// 2) 同时写 store
pinia._s.get('smtChoiceAddStore').$state.describeInfoData.detail = html;
```
## 另一个未验证项:4 个规格组都是 0 选项## 另一个未验证项:4 个规格组都是 0 选项
`smtChoiceSkuAttrStore.formState.skuAttrs` 有 4 组:
`Ships From(200007763) / Color(14) / Number of Pcs(200116262) / Bulk Buy(200483263)`,
但 `options` 都是 0(值在 `_options` 或要异步加载),DOM 里能看到值(卡其色/粉红/6Pc/Set…)。
**实测:不选变种值也能保存成功**(保存链路里没有因为变种报错),所以批量里先不选。
## 单条顺序(批量脚本里的固定顺序)
`店铺 → 备货类型 → 类目 → 标题/主图/SKU行 → 必填属性(品牌/高关注化学品/产地) → PC端描述(CKEditor)
→ 保存① → 物流属性(普货) → 保存② → 待发布`
## 本轮顺手修好的共享 bug(`shein建品/sh_build.mjs` 的 `fillRequiredSelects`)
之前它在 aliChoice 上**一个必填属性都填不上**,三个原因,都已修:
1. select 分支的必填判断只看 `label.ant-form-item-required`,而速卖通系的属性是
`.attr-label.required`(label 上还常带 `*` 前缀)→ 现在三种标记都认
2. 容器项「产品属性」本身也带 `*`,会被当成一个字段去点 → 现在跳过**含嵌套 `.ant-form-item`** 的项
3. 点开下拉后按 `.pop()` 取最后一个可见下拉,容易读到**上一个字段残留**的列表
(曾把化学物列表当国家列表)→ 现在①每次点前先 `Esc` ②按**与点击点的距离**挑下拉
③产地/Origin 先 `Input.insertText('中国')` 过滤
---
## ⚠️ 批量首次运行的成败分类(6 条:2 成功 / 4 失败)→ 已停批量
| 现象 | 根因 | 处置 |
|---|---|---|
| `请上传文件!`(`商品说明书`) | **健康/医疗类目强制资质文件**(与 HOOK.md 里速卖通 POP 那条同源) | 换不要求说明书的类目;无干净替代类目的商品只能人工处理 |
| `请选择产品属性`(`是否包含电池`) | 该下拉**点不开**(`no-dd`),疑似要先把别的属性选完才可用 | 待查:单独 dump 这个控件的依赖关系 |
| `请选择物流属性` | 已知,走「保存①→点 icon_edit2→勾普货→保存②」 | 批量里已实现 |
| `选类目失败:no-path` | `cat_kw` 在 aliChoice 类目树里搜不到 | **已修**:依次回退 `cat_fb`(tk_input 里给的后备品类词) |
**结论**:aliChoice 能不能铺,取决于**类目能不能选到不要求资质文件的那一支**。
下一轮建议:先把 48 条的 `cat_kw → 实际类目` 跑一遍 dry(不保存),
把落到健康/医疗/化妆品等强资质类目的商品挑出来,再决定是换词还是跳过。
失败记录现在会带 `errItems`(例如 `商品说明书:请上传文件!`),见 `alc_done.json`。