From 00201b692584187ed02eead61ceac6aab150ce77 Mon Sep 17 00:00:00 2001 From: admin9webs Date: Sun, 20 Sep 2026 23:22:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=20aliChoice=20=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E5=8F=98=E9=87=8F=E9=81=AE=E8=94=BD=E5=B4=A9?= =?UTF-8?q?=E6=BA=83=EF=BC=88const=20t=20=E6=92=9E=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=BE=AA=E7=8E=AF=E5=8F=98=E9=87=8F=EF=BC=8C8=20=E6=9D=A1?= =?UTF-8?q?=E6=8C=82=20ReferenceError=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- alichoice建品/RECIPE.md | 58 ++++++++++++++++++++++++++++++++++++++ alichoice建品/alcbatch.mjs | 6 ++-- 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/alichoice建品/RECIPE.md b/alichoice建品/RECIPE.md index c2f9e23..77c3495 100644 --- a/alichoice建品/RECIPE.md +++ b/alichoice建品/RECIPE.md @@ -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分类` 是**原生 ` + + + … + + +``` +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` 已经被占用)。 diff --git a/alichoice建品/alcbatch.mjs b/alichoice建品/alcbatch.mjs index 1e7587b..f5b8180 100644 --- a/alichoice建品/alcbatch.mjs +++ b/alichoice建品/alcbatch.mjs @@ -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';