修 aliChoice 批量脚本变量遮蔽崩溃(const t 撞任务循环变量,8 条挂 ReferenceError)

This commit is contained in:
admin9webs committed 2026-09-20 23:22:17 +08:00
1 parent ad9b955d95
commit 00201b6925
2 files changed
+61 -3

No files matched your search

+58
View File
@@ -96,3 +96,61 @@ pinia._s.get('smtChoiceAddStore').$state.describeInfoData.detail = html;
| `材质(Material):` / `尺寸(Size):` | 类目动态属性里**把下拉当文本**的项,`fillRequiredSelects` 选了但值没生效(红色提示为空)→ 下一步 dump 这两项的控件类型(可能是可搜索 select 或 input) |
成材率从 2/6 提升到 5/8,其余靠这两类补齐。
---
## 根因修正(第 4 轮):那串「材质/尺寸/品牌」报错其实是**类目弹窗没关**
复现时 `selectCategory` 返回了 `path:… / MODAL-STILL-OPEN` —— 类目弹窗还开着,
**后面所有必填属性的点击全被遮罩挡住**,于是保存时报出一串看起来五花八门的必填
(品牌/产地/材质/尺寸),让人误以为是「属性选不上」。真正要修的是关弹窗。
**修法**(`sh_build.mjs` 的 `selectCategory` 收尾循环):3 轮 → **6 轮**,每一轮都试
`确定|选择` → 再试 `关闭|取消` → 点右上角 × → 发 `Escape`;第 4 轮起再点一次
`.ant-modal-wrap`(遮罩)兜底。返回值里仍带 `MODAL-STILL-OPEN` 便于发现没关干净。
## 第二类:`材质(Material)` 是**文本输入**,不是下拉
`fillRequiredSelects` 只处理 select 和勾选组,遇到 `INPUT.ant-input` 直接跳过,
所以材质永远填不上。新增 `fillRequiredTextInputs(c, values)`:
- 只挑**必填 + 空 + 含 `input.ant-input`/`textarea.ant-input`** 的叶子表单项
- 用原生 setter 写值 + 派发 `input`/`change`/`blur`
- `values` 按顺序发(不够就重复最后一个)
批量里给的候选值:先从标题里猜材质词(plastic/cotton/polyester/stainless steel/metal/
silicone/wood/resin/aluminum/alloy/fabric/nylon/glass/ceramic/leather),再退 `Polyester`、`Other`。
⚠️ 这是**兜底值**,材质属于商品事实,后续应人工抽查(尤其非纺织类)。
---
## 第 5 轮:`请选择SKU分类` 是**原生 `<select>`**(不是 antd)
报错项的 DOM:
```html
<div class="ant-form-item-has-error">
<select class="w-180! shrink-0 g-form-component">
<option disabled selected>请选择</option>
<option value="1">单品单件</option><option value="2">同款多件</option><option value="3">混合套装</option>
…
</select>
</div>
```
antd 系的 `.ant-select` 选择器一个都匹配不到 → 新增
`fillNativeSelects(c, ['单品单件','件/个'])`:遍历可见原生 `select`,
值为空/停在下拉占位项时,优先选含「单品单件」「件/个」的项,否则选第一个可用项,
`sel.value=…` + 派发 `input`/`change`。**效果:失败从 6/10 降到 8/10**,`SKU分类` 类失败归零。
## ⚠️ 自己引入的数据质量问题(已修,未落库)
`fillRequiredTextInputs` 一开始对**所有**文本必填都发同一个材质词,
结果把「颜色(Color)」填成了 `Resin`。已改为**按字段名给值**(helper 支持传函数):
- `颜色|Color` → 标题里的颜色词,兜底 `Multicolor`
- `材质|Material` → 标题里的材质词,兜底 `Polyester`
- `图案|Pattern` → `Solid`;`尺寸|Size` → `Medium`;其余 → `Other`
查过 `alc_done.json`:**被填错的 `866537106657` 当时是失败状态**(`errItems=["颜色(Color):"]`),
没有落成脏数据,已用新代码重跑。
### 第 5 轮的自我踩坑(留个记录)
给「文本必填按字段名给值」打补丁时,我用 `const t = String(it.title)` 存标题——
**`t` 是外层任务循环变量**,块级 `const` 把它推进 TDZ,整批 8 条当场挂在
`ReferenceError: Cannot access 't' before initialization`。改名 `ttl` 后恢复。
教训:往批量脚本里塞局部变量前,先看一眼外层循环变量叫什么(同一函数里 `t` 已经被占用)。
+3 -3
View File
@@ -140,9 +140,9 @@ for (const t of tasks) {
if (attrs !== 'none') log(` 必填属性: ${String(attrs).slice(0, 150)}`);
await wait(1200);
// 文本型必填(aliChoice 的「材质(Material)」是 input,不是 select):按标题里的材质词兜底
const t = String(it.title || '');
const matHit = t.match(/plastic|cotton|polyester|stainless steel|metal|silicone|wood|resin|aluminum|alloy|fabric|nylon|glass|ceramic|leather/i);
const colorHit = t.match(/black|white|pink|red|blue|green|beige|grey|gray|purple|yellow|brown|khaki|ivory|apricot|silver|gold|multicolou?r/i);
const ttl = String(it.title || '');
const matHit = ttl.match(/plastic|cotton|polyester|stainless steel|metal|silicone|wood|resin|aluminum|alloy|fabric|nylon|glass|ceramic|leather/i);
const colorHit = ttl.match(/black|white|pink|red|blue|green|beige|grey|gray|purple|yellow|brown|khaki|ivory|apricot|silver|gold|multicolou?r/i);
// 按字段名给值:颜色别串成材质(曾把「颜色」填成 Resin)
const valueFor = (name) => {
if (/颜色|Color/i.test(name)) return colorHit ? colorHit[0] : 'Multicolor';