v110-v112 自定义模式完善 + 模板导出增强 + 多模态兼容优化

- 自定义模式:分析模型输出 delta 唯一改动指令,生图模板 custom_image_prompt.md({delta} 占位符),不再使用负向提示词;generate_design 按 custom_mode 分支,Pinterest 模式保留原创化指令,两模式互不影响
- 多模态分析 response_format 三级回退(json_schema → json_object → none),兼容 DeepSeek
- 模板导出:details 扩展列(细节1/2/3)、target_audience 扩展列(适用人群1)、固定值风格1=休闲/风格2=运动
- 童装特征库更新 + 标题模板外部化 + 图源映射增强
This commit is contained in:
2026-09-03 18:28:39 +08:00
parent d68cc3b9e3
commit 5ab5cf6586
40 changed files with 1967 additions and 149 deletions
+95
View File
@@ -0,0 +1,95 @@
# 2026-09-03 工作日志
## 新增:Inkreach 商城款号爬取脚本 `crawl_style_codes.py`
- 需求:按【国家 + 品类】爬取款号(如 DG505 / JPTM001 / PLTK005),去重输出。
- 接口探查结论(重要,见 MEMORY.md 已固化):后端走 **mapi.sdspod.com**`api.sdspod.com` 在本机 DNS 解析不到,勿用)。
- 端点:`/products/pageOptionGroup`(国家列表 14 国)、`/products/page`(商品分页)、`/categories`(品类树 26 顶层)。
- 坑:`overseasArea`(国家)与 `id`(品类)筛选参数**实测不生效**(各国 totalCount 恒为 536)→ 改为全量分页拉取 + 本地聚合。
- 商品 `categories` 标签顺序固定:`[国家/工厂标签, 品类, "款号 品名"]`(如 `美国工厂直发 | 男士T恤 | DG505 180g男士纯棉长袖`),这是国家/品类/款号最可靠的来源。
- 款号提取三个坑及修复:
1. `SFB`(墨西哥运动短裤)是**纯字母无数字**款号 → 改为优先用 categories 的「款号 品名」标签识别,不再强制要求含数字。
2. 「中东本地工厂直发」属沙特,但正式国名是「沙特阿拉伯」→ 加 `COUNTRY_ALIASES` 别名表(中东→SA、国内工厂→CN)。
3. 尺码串(S/M/XL/2XL/3XL)会被旧规则误当款号 → 加 `SIZE_WORDS` 黑名单(US 因此由 60 校正为 56)。
- CN(国内工厂)4 条商品 name 无国家前缀、且本身无款号 → 用 `shipmentArea` 兜底归国家,款号留空。
- 结果:在架商品 540(海外 536 + 国内 4)→ **13 国 / 65 个品类组合 / 150 条;全局去重款号 149 个**
- 产物:`style_codes_by_country.json`(按国家→品类→款号)、`style_codes_by_country.csv`country_code,country,category,style_codeutf-8-sig)。
## 数据维护(同日早些时候)
- SPU 表新增 `kids_type``kids_age` 两字段(TEXT,默认 NULL 空),`create_db.py` 已同步;SPU 现 39 字段。备份 `spu_sku.db.bak_spu_kids`
- SKU:按 `PLTK005-WH01` 复制生成 6 行 `PLTK005-BL01`6Y/7Y/8Y/9Y/10Y/11-12Y),code 与 color=黑色 覆盖,其余字段照抄;PLTK005 SKU 由 12 → 18。备份 `spu_sku.db.bak_pltk005_bl01`
- SKU `color` 规范化(单字 → 「X色」):
- 纯「黑」256 + 纯「白」149 = 405 行(备份 `spu_sku.db.bak_color_fix`)。
- 其余单字 杏68/棕8/灰136/粉23/紫32/红76/绿45/蓝30/黄3 = 421 行(备份 `spu_sku.db.bak_color_single`)。
- 未动:多字与组合色(`黑色 白色``白色 蓝色 红色 皇家蓝``黑胡椒色``象牙白``米白` 等)。
## 品类白名单过滤(同日追加)
- 需求:只保留 T恤/卫衣/长袖/背心/夹克,删除下装与家居类,**对应款号一并删除**。
- 实现:`crawl_style_codes.py` 加常量 `KEEP_CATEGORY_KEYWORDS = ("T恤","卫衣","长袖","背心","夹克")`,在按品类聚合前过滤(品类名含任一关键词才保留);**置空该常量即恢复全量输出**。
- 剔除 80 条商品,涉及品类:下装(短裤 & 长裤)20、男士短裤 16、女士短裤 14、家居配饰 10、内衣 6、家居 5、桌面用品 2、配饰 2、男士长裤 2、童装短裤 2、印花烫贴 1。
- 结果:13 国 / 10 个品类(女士T恤/女士卫衣/女士背心/男士T恤/男士T恤·GBTM011长袖T/男士卫衣/男士夹克/男士背心/童装T恤/童装卫衣)/ 116 条;**全局去重款号 149 → 115**。
- 注:此过滤只作用于爬取产物(json/csv),未改动 SQLite 数据库。
## 按爬取清单清洗数据库(删除非清单款号)
- 备份:`spu_sku.db.bak_before_style_filter`(删前状态 SPU 143 / SKU 2864)。
- 规则:以 `style_codes_by_country.json` 的 115 个款号为准,`spu.code`UPPER+TRIM)不在清单内的 SPU 及其 SKU 全部删除。
- 结果:删除 **37 个 SPU / 476 条 SKU**;剩余 **SPU 106 / SKU 2388**;孤儿 SKU = 0。
- 被删主力:US 的 DG201/202/204/205/206/210(下装)、JSD001~007(短裤)、JSA002/003/007/010(内衣·短裤)、USIU002/005/012(家居)、YSM01/02(配饰);JP 的 JPIU014/020/021(家居配饰)、JPPM011/JPSM018(下装)、JPJF005PL 的 PLHM011/PLPM014/PLSU025(下装);GB 的 GBIU009/014/015DE 的 DEPM004MX 的 SFB。
- 清单有但库里未入库的 9 个款号(本次未补,后续可从 PG 同步):BRTF004、DG505、GBHK007、GBTK012、GBTM010、GBTM011、JPPX012、JPPX013、PLTM031。
- 审计文件:`delete_non_keep_codes.sql`(含完整 115 款号 IN 清单,可复核/重放)。
## 童装T恤款号字段批量更新
- 依据:`style_codes_by_country.csv/json` 中品类含「童装T恤」的款号共 19 个,库中命中 **18 个**GBTK012 尚未入库)。
- 更新 4 个字段:`target_audience='男童'``season='ALL/全球/所有'``kids_type='上衣'``kids_age='12岁及以下'`,影响 18 行。
- 覆盖国家:US(5000B/DG012/DG014/DG301/DG503/JSA004)、PL(PLHM012/PLHM013/PLTK005/PLTK015/PLTK016)、GB(GBTK005/GBTK008)、JP(JPTK015)、MX(METN001)、SA(SATK004)、ES(ESTK005)、IT(ITTK002);清单国家与库内 country 全部一致。
- 备份:`spu_sku.db.bak_kids_tshirt`;审计 SQL`kids_tshirt_update.sql`
- 备注:GBHM002/GBHM003 的 season 早就是 'ALL/全球/所有'(历史值,非本次改动);**童装卫衣**品类(清单 5 个 / 库中 4 个)本次未改,待用户决定是否同样套用童装字段。
## 男士卫衣款号字段批量更新
- 依据:清单中品类含「男士卫衣」的款号共 21 个,库中命中 **19 个**JPPX012/JPPX013 尚未入库);国家一致性全部 OK。
- 更新 5 个字段:`details='抽绳'``collar_style='连帽'``target_audience='男士'``season='秋/冬'``sleeve_length_type='长袖'`,影响 19 行。
- 覆盖:US(DF009/DF010/JSB001/JSB002/JSB003)、PL(PLHM002/PLHM003)、GB(GBHM002/GBHM003)、JP(JPHM009/JPHM010)、KR(KRHM002/KRHM003)、ES(ESHM003/ESHM004)、MX(HM01)、CA(CAHM002)、DE(DEHM003)、SA(SAHM003)。
- 备份:`spu_sku.db.bak_men_hoodie`;审计 SQL`men_hoodie_update.sql`
- 备注:GBHM002/GBHM003 原 season='ALL/全球/所有'(历史值)已被本次覆盖为 '秋/冬';当前全表 season 分布 = 秋/冬 19 + ALL/全球/所有 18(童装T恤)+ 四季 69。
## 品类→字段批量套用模板(可复用)
- 数据源固定:`style_codes_by_country.json`(按 国家→品类→款号 组织),脚本 `crawl_style_codes.py` 可重跑刷新。
- 标准流程:备份 → 从 json 取「品类含关键词」的款号 → 与 spu.code(UPPER+TRIM) 比对(列出命中/缺失/国家是否一致)→ 事务 UPDATE → 验证明细与全表分布 → 审计 SQL 落盘。
- 已套用:童装T恤(18 个,男童/ALL全球/上衣/12岁及以下)、男士卫衣(19 个,抽绳/连帽/男士/秋·冬/长袖)。
## 新增袖长列 sleeve_length(用户选「加一列」方案)
- 背景:商城无袖长分类字段(见 MEMORY.md 三套分类体系),长袖信息只写在商品 name 里,故按分类筛不出长袖。
- 实现:`crawl_style_codes.py` 新增 `guess_sleeve_length(name, category)`,判定优先级:
1. name 含「无袖/背心/吊带」或品类含「背心」→ 无袖
2. name 含「长袖」→ 长袖
3. name 含「短袖」→ 短袖
4. 品类含「卫衣/夹克」→ 长袖(推断)
5. 其余普通 T 恤 → 短袖(默认)
- 产出:CSV 由 4 列扩为 5 列(country_code, country, category, style_code, **sleeve_length**);JSON 每个国家下新增 `sleeve_length``sleeve_source`(判定来源,便于审计修正)。
- 结果:长袖 37(name 标注 9 + 品类推断 28)、短袖 69(name 标注 6 + 默认 63)、无袖 9,合计 115 个款号全覆盖、无空值。
- 注意:63 个「默认短袖」与 28 个「卫衣/夹克推断长袖」属推断值,如需人工校正以 `sleeve_source` 列筛选即可。
## 袖长回填 SPU.sleeve_length_type(区分长袖)
- 用户需求:「先帮我把长袖给区分出来」→ 把清单 sleeve_length 回填到 SPU 表,让库里能直接筛出长袖。
- 执行:以 `style_codes_by_country.csv` 的 sleeve_length 为准回填全部 106 个款号;**更新 20 行**
- 12 个 **短袖→长袖**(藏在 T恤/卫衣/夹克里):DG501/DG502/DG503/DG504/GBHK006/JPTM006/KRTM004/PLHF029/PLHM009/PLHM010/PLJM030/PLTF026
- 8 个 **短袖→无袖**(背心款):AUTM003/JPTM008/JSA009/TBB001/VS001/VS002/VS003/VS004
- 更新后分布:**长袖 31 / 短袖 66 / 无袖 9**=106)。清单长袖 37 6 个未入库长袖款(DG505/GBTM011/GBTK012/JPPX012/JPPX013 等)= 31。
- 备份:`spu_sku.db.bak_sleeve_backfill`;审计 SQL`sleeve_backfill.sql`106 条逐款 UPDATE)。
## 长袖T恤细化(品类含 T恤 且 长袖 → season=秋/冬)
- 规则:清单 category 含「T恤」且 sleeve_length='长袖' 的款号 → SPU `sleeve_length_type='长袖'``season='秋/冬'`
- 清单共 8 款(DG502/DG503/DG505/GBTK012/GBTM011/JPTM006/KRTM004/PLTF026),库中命中 **5 个**DG505/GBTK012/GBTM011 未入库)。
- sleeve_length_type 上一步回填时已为长袖;本次主要把 season 改「秋/冬」;注意 DG503(童装T恤)season 由「ALL/全球/所有」被覆盖为「秋/冬」(用户指定)。
- 全表 season 分布更新为:秋/冬 24(男士卫衣 19 + 长袖T恤 5/ ALL/全球/所有 17 / 四季 65。
- 备份:`spu_sku.db.bak_tee_long`;审计 SQL`tee_long_update.sql`
## 童装款 SKU size_type 统一为「欧美尺码年龄码」
- 范围:清单 category 含「童装」的款号 = 童装T恤 19 + 童装卫衣 5 = 24 个;库中命中 **22 个**GBHK007/GBTK012 未入库)。
- 更新:22 款对应 **508 条 SKU**`size_type='欧美尺码年龄码'`
- 注意:① JPTK015(JP) 的 size_group 仍为「亚洲尺码」、size_type 现在是「欧美尺码年龄码」——组合不一致,待用户确认是否妥当;② 部分童装款实际 size 是 XS-XL5000B/METN001/SATK004/DG012 等)或 90~170 体码(DG014/DG503/DG504/JSA004/JPTK015),本次仅统一 size_type 文案、未改 size。
- 备份:`spu_sku.db.bak_kids_sizetype`;审计 SQL`kids_size_type_update.sql`
## 背心款 sleeve_length_type 幂等确认
- 范围:清单品类含「背心」共 9 款(男士背心 AUTM003/JPTM002/JPTM008/TBB001/VS001/VS003;女士背心 JSA009/VS002/VS004),库中全部命中。
- 结果:9 款在「袖长回填」那步已统一为「无袖」,本轮幂等 UPDATE 确认状态正确(值无实际变化)。
- 备份:`spu_sku.db.bak_vest`;审计 SQL`vest_update.sql`(可复用)。
+17
View File
@@ -23,3 +23,20 @@
- 部分品类 colors.code 为脏数据(如 'METB001-S-3XL黑色'、'5000B-黑色'、'SFB-黑色')→ 兜底补全
- 部分品类无 product_extra(如 SFB/5000B)→ 尺码走 size_chart 回退,包装/重量留空
- 家居类尺码格式不一致('30*40/76.2*101.6' vs '30*40')、均码叫法不同(Onesize vs 均码)→ 已加归一化兜底
## Inkreach 商城公开 API(供 crawl_style_codes.py 复用)
- 域名:`https://mapi.sdspod.com`**坑:前端 JS 里写的 `api.sdspod.com` 在本机 DNS 解析不到,不可用**)
- 端点(无需鉴权,带 Referer: https://www.inkreach.cn/ 即可):
- `/products/pageOptionGroup` → shipmentCountryList14 国(US/PL/GB/JP/MX/SA/CA/ES/AU/DE/KR/BR/IT/CN,含各国商品数)
- `/products/page` → 商品分页,参数 `shipmentArea=overseas|CN``page``size`size 可到 100
- `/categories` → 品类树,26 个顶层(含「美国/欧洲/日本…本地直发」这类国家维度)
- **大坑**`overseasArea`(国家)与 `id`(品类)筛选参数实测**不生效**(各国 totalCount 恒等)→ 只能全量分页拉取后本地聚合。
- 商品结构:`categories` 标签顺序固定 = `[国家/工厂标签, 品类, "款号 品名"]`,例:`美国工厂直发 | 男士T恤 | DG505 180g男士纯棉长袖`——国家/品类/款号最可靠的来源。
- 款号提取:优先 categories 的「款号 品名」标签(能覆盖纯字母款号如 `SFB`),其次 name 的 `-` 分段;必须用 `SIZE_WORDS` 排除尺码串(S/M/XL/2XL/3XL 会被误判)。
- 国家别名:中东→SA(沙特,站点文案非「沙特阿拉伯」)、国内工厂→CN;CN 商品 name 无国家前缀,用 `shipmentArea` 兜底。
- 规模参考:在架商品 540(海外 536 + 国内 4)→ 13 国、**149 个去重款号**(CN 4 条本身无款号)。
- **三套分类体系(大坑,已查证)**:
1. `/categories` 品类树:625 个节点,含「长袖T恤」等 14 个长袖节点,但**没有任何商品挂在上面**(商品 category_id 全都不在这棵树里)。
2. 商品 `category_id`:取值在 8186~8741 区间,**不属于** `/categories` 树(树节点 id 是 1295~8659 另一套),无法互相映射。
3. 商品 `categories` 标签(脚本用的就是它):`[国家/工厂, 人群款式, "款号 品名"]`,按国家+人群款式组织。
- **「长袖/短袖」不是分类,只写在商品 name 里**:全站 name 含"长袖"的商品 30 条 → 9 个款号(DG502/DG503/DG505/GBTK012/GBTM011/JPTM006/KRTM004/PLHF029/PLTF026),它们被并入 男士T恤/女士T恤/童装T恤/女士卫衣 品类。要按长袖筛选只能从 name 判断。
+350
View File
@@ -0,0 +1,350 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
按【国家 + 品类】爬取 Inkreach 商城商品款号(如 DG505、JPTM001、PLTK005),去重后输出。
数据源(均为公开只读接口):
- 国家列表 : GET {BASE}/products/pageOptionGroup -> shipmentCountryList (code / 中文名 / 商品数)
- 品类树 : GET {BASE}/categories -> 品类层级(辅助,商品自带品类标签优先)
- 商品列表 : GET {BASE}/products/page -> 分页商品(shipmentArea=overseas / CN
说明:
- 服务端 overseasArea / id 筛选参数实测不生效,因此采用「全量分页拉取 + 本地按国家/品类聚合」。
- 款号从商品 name 中提取:name 形如 "美国(不包邮)180g男士纯棉长袖-DG505-单面印花-美西洛杉矶一仓"
取被 "-" 分隔、且满足「纯大写字母+数字、长度 3~8、同时含字母和数字」的段。
- 国家由商品 categories[0](如"美国工厂直发"/"巴西本地工厂直发")与 name 前缀匹配中文国家名得到。
品类白名单:
- 只输出品类名含 T恤 / 卫衣 / 长袖 / 背心 / 夹克 的款号(见 KEEP_CATEGORY_KEYWORDS);
下装(短裤/长裤)、家居、家居配饰、内衣、配饰、印花烫贴、桌面用品等品类连同其款号一并剔除。
- 恢复全量:把 KEEP_CATEGORY_KEYWORDS 改成空元组 () 重跑即可。
输出(与脚本同目录):
- style_codes_by_country.json {国家代码: {country, categories: {品类: [款号...]}}}
- style_codes_by_country.csv 国家代码,国家,品类,款号
"""
import csv
import json
import re
import sys
import time
import urllib.parse
import urllib.request
from collections import defaultdict
try:
sys.stdout.reconfigure(encoding="utf-8")
except Exception:
pass
BASE = "https://mapi.sdspod.com"
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"Accept": "application/json",
"Referer": "https://www.inkreach.cn/",
}
PAGE_SIZE = 100 # 实测服务端允许的最大分页大小
REQUEST_DELAY = 0.3 # 请求间隔(秒),礼貌爬取
TIMEOUT = 30
RETRIES = 3
OUT_JSON = "style_codes_by_country.json"
OUT_CSV = "style_codes_by_country.csv"
# 品类白名单:品类名包含任一关键词才保留,其余(下装/短裤/长裤/家居/家居配饰/内衣/
# 配饰/印花烫贴/桌面用品 等)连同其款号一并剔除。想恢复全量,把这里改成空元组即可。
KEEP_CATEGORY_KEYWORDS = ("T恤", "卫衣", "长袖", "背心", "夹克")
# ---------------------------------------------------------------- 基础请求
def http_get_json(path, params=None):
"""GET 请求,返回 dict;失败自动重试。"""
url = BASE + path
if params:
url += "?" + urllib.parse.urlencode(params)
last_err = None
for attempt in range(1, RETRIES + 1):
try:
req = urllib.request.Request(url, headers=HEADERS)
with urllib.request.urlopen(req, timeout=TIMEOUT) as resp:
return json.loads(resp.read().decode("utf-8"))
except Exception as e: # noqa: BLE001
last_err = e
if attempt < RETRIES:
time.sleep(1.0 * attempt)
raise RuntimeError(f"请求失败 {url} -> {last_err}")
# ---------------------------------------------------------------- 数据抓取
def fetch_countries():
"""返回 [(countryCode, 中文名, 商品数), ...],按名称长度降序(便于长名优先匹配)。"""
d = http_get_json("/products/pageOptionGroup")
lst = d.get("shipmentCountryList") or []
out = [(c.get("countryCode") or "", c.get("country") or "", c.get("num") or 0) for c in lst]
out.sort(key=lambda x: -len(x[1]))
return out
def fetch_all_products():
"""分页拉取全部商品(海外 + 中国两个发货区域),按 id 去重。"""
products, seen = [], set()
for area in ("overseas", "CN"):
page, got = 1, 0
while True:
d = http_get_json("/products/page", {"shipmentArea": area, "page": page, "size": PAGE_SIZE})
items = d.get("items") or []
if not items:
break
for it in items:
pid = it.get("id")
if pid in seen:
continue
seen.add(pid)
it["_shipmentArea"] = area
products.append(it)
total = int(d.get("totalCount") or 0)
got += len(items)
print(f" [{area}] page={page:<3} +{len(items):<4} 本区累计 {got}/{total}")
if got >= total or len(items) < PAGE_SIZE:
break
page += 1
time.sleep(REQUEST_DELAY)
return products
# ---------------------------------------------------------------- 解析规则
CODE_SEG = re.compile(r"^[A-Z0-9]{2,8}$")
CODE_LABEL = re.compile(r"^([A-Z0-9]{2,8})\s+") # "DG505 180g男士纯棉长袖"
CODE_INLINE = re.compile(r"\b([A-Z]{1,5}\d{2,6}[A-Z]?|\d{2,5}[A-Z]{1,3})\b")
# 尺码词:避免把 S / M / XL / 3XL 之类误判成款号
SIZE_WORDS = {"S", "M", "L", "XL", "XXL", "XXXL", "XXXXL", "XXXXXL",
"XS", "XXS", "2XL", "3XL", "4XL", "5XL", "6XL", "SML", "ML", "OS"}
# 国家别名:站点文案与 pageOptionGroup 的正式国名不一致时的映射
COUNTRY_ALIASES = {
"中东": "SA", # "中东本地工厂直发" -> 沙特阿拉伯(SA)
"国内工厂": "CN", # "国内工厂" -> 中国(CN)
}
def is_valid_code(s):
"""款号合法性:2~8 位大写字母/数字,含字母,且不是尺码词。"""
s = (s or "").upper()
if s in SIZE_WORDS:
return False
if not CODE_SEG.match(s):
return False
return bool(re.search(r"[A-Z]", s)) # 必须含字母,排除 "180" 之类纯数字
def extract_style_code(name, cats):
"""提取款号:优先 categories 的『款号 品名』标签,其次 name 的 '-' 分段,最后全局正则。"""
# 1) categories 里的 "DG505 180g男士纯棉长袖" / "SFB 运动短裤"(最可靠,纯字母款号也能拿到)
for c in cats:
m = CODE_LABEL.match(c.strip())
if m and is_valid_code(m.group(1)):
return m.group(1).upper()
# 2) name 按 '-' 分段
for seg in (name or "").split("-"):
s = seg.strip().upper()
if is_valid_code(s):
return s
# 3) 兜底:全局正则
m = CODE_INLINE.search(name or "")
if m and is_valid_code(m.group(1)):
return m.group(1).upper()
return None
def match_country(text, head, countries, area=None):
"""匹配国家:别名 -> name 前段 -> 全文 -> shipmentArea 兜底。"""
cn_by_code = {code: cn for code, cn, _ in countries}
for alias, code in COUNTRY_ALIASES.items():
if alias in head or alias in text:
return code, cn_by_code.get(code, alias)
for scope in (head, text):
for code, cn, _ in countries:
if cn and cn in scope:
return code, cn
if area == "CN":
return "CN", cn_by_code.get("CN", "中国")
return "UNKNOWN", "未识别"
def pick_category(cats, cn_name, style_code):
"""品类 = categories 中去掉『国家/工厂标签』与『款号+品名标签』后剩下的部分。"""
rest = []
for c in cats:
c_stripped = c.strip()
if not c_stripped:
continue
if cn_name and cn_name in c_stripped: # 国家标签,如"美国工厂直发"
continue
if "直发" in c_stripped or "工厂" in c_stripped:
continue
head = c_stripped.split(" ")[0]
if style_code and head.upper() == style_code.upper(): # "DG505 180g男士纯棉长袖"
continue
rest.append(c_stripped)
return " / ".join(rest) if rest else "未分类"
def guess_sleeve_length(name, category):
"""推断袖长,返回 (袖长, 来源)。
商城没有袖长分类字段,只能从商品名/品类推断,来源用于审计:
- 商品名明确写「长袖/短袖/无袖」 -> 来源 "name"
- 品类是背心/吊带 -> 无袖,来源 "品类"
- 品类是卫衣/夹克 -> 长袖,来源 "品类推断"(卫衣、夹克默认长袖)
- 其余(普通 T 恤,名里没写) -> 短袖,来源 "默认(T恤)"
"""
n, c = name or "", category or ""
if "无袖" in n or "背心" in n or "吊带" in n or "背心" in c:
return "无袖", "品类" if ("背心" in c and "背心" not in n and "无袖" not in n) else "name"
if "长袖" in n:
return "长袖", "name"
if "短袖" in n:
return "短袖", "name"
if "卫衣" in c or "夹克" in c:
return "长袖", "品类推断"
return "短袖", "默认(T恤)"
# ---------------------------------------------------------------- 主流程
def main():
print("=" * 66)
print("Inkreach 款号爬取:按国家 + 品类,去重")
print("=" * 66)
print("\n[1/4] 获取国家列表 ...")
countries = fetch_countries()
for code, cn, num in countries:
print(f" {code:<8} {cn:<10} {num:>4} 个商品")
print(f"{len(countries)} 个国家/地区")
print("\n[2/4] 获取品类树 ...")
try:
cat_tree = http_get_json("/categories").get("items") or []
leaf = sum(len(c.get("subcategory") or []) for c in cat_tree)
print(f" 顶层品类 {len(cat_tree)} 个,二级品类 {leaf} 个(商品自带品类标签优先,此树仅参考)")
except Exception as e: # noqa: BLE001
print(f" 品类树获取失败(不影响主流程): {e}")
print("\n[3/4] 分页拉取全部商品 ...")
products = fetch_all_products()
print(f" 商品总数(去重后): {len(products)}")
print("\n[4/4] 解析并按 国家 / 品类 聚合款号 ...")
# country_code -> category -> {style_code}
data = dict()
country_cn = {}
no_code = []
dropped = defaultdict(int) # 被品类白名单剔除的品类 -> 商品条数
sleeve_map = {} # 款号 -> (袖长, 来源)
for it in products:
name = it.get("name") or ""
cats = [c.get("name", "") for c in (it.get("categories") or [])]
text = " ".join([name] + cats)
head = name[:12] # 国家一般写在 name 最前面
code, cn = match_country(text, head, countries, it.get("_shipmentArea"))
style = extract_style_code(name, cats)
if not style:
no_code.append(name)
continue
style = style.upper()
category = pick_category(cats, cn, style)
# 品类白名单过滤:只保留 T恤/卫衣/长袖/背心/夹克,其余品类及其款号一并剔除
if KEEP_CATEGORY_KEYWORDS and not any(k in category for k in KEEP_CATEGORY_KEYWORDS):
dropped[category] += 1
continue
country_cn.setdefault(code, cn)
data.setdefault(code, {}).setdefault(category, set()).add(style)
if style not in sleeve_map:
sleeve_map[style] = guess_sleeve_length(name, category)
if no_code:
print(f"{len(no_code)} 条商品未提取到款号(见控制台样例):")
for n in no_code[:5]:
print(f" - {n}")
if dropped:
print(f" 已按品类白名单剔除 {sum(dropped.values())} 条商品,涉及品类:")
for c, n in sorted(dropped.items(), key=lambda x: -x[1]):
print(f" - {c}{n} 条)")
# ---------------- 汇总输出 ----------------
print("\n" + "=" * 66)
print("汇总:各国品类数 / 款号数(去重)")
print("=" * 66)
print(f"{'国家':<12}{'代码':<8}{'品类数':>8}{'款号数':>10}")
print("-" * 66)
total_cats = total_codes = 0
all_codes = set()
for code in sorted(data, key=lambda c: -sum(len(v) for v in data[c].values())):
cats_map = data[code]
n_codes = sum(len(v) for v in cats_map.values())
total_cats += len(cats_map)
total_codes += n_codes
for v in cats_map.values():
all_codes |= v
print(f"{country_cn.get(code,''):<12}{code:<8}{len(cats_map):>8}{n_codes:>10}")
print("-" * 66)
print(f"{'合计':<20}{total_cats:>8}{total_codes:>10} (全局去重款号 {len(all_codes)} 个)")
# ---------------- 袖长分布 ----------------
if sleeve_map:
print("\n=== 袖长分布(按款号去重)===")
sl_cnt, src_cnt = defaultdict(int), defaultdict(int)
for v, s in sleeve_map.values():
sl_cnt[v] += 1
src_cnt[s] += 1
for k, v in sorted(sl_cnt.items(), key=lambda x: -x[1]):
print(f" {k:<6} {v:>4} 个款号")
print(" 判定来源:", dict(sorted(src_cnt.items(), key=lambda x: -x[1])))
# ---------------- 写 JSON ----------------
out = {}
for code, cats_map in data.items():
codes_here = sorted({c for v in cats_map.values() for c in v})
out[code] = {
"country": country_cn.get(code, ""),
"categories": {c: sorted(v) for c, v in sorted(cats_map.items())},
"sleeve_length": {c: sleeve_map.get(c, ("", ""))[0] for c in codes_here},
"sleeve_source": {c: sleeve_map.get(c, ("", ""))[1] for c in codes_here},
}
with open(OUT_JSON, "w", encoding="utf-8") as f:
json.dump(out, f, ensure_ascii=False, indent=2)
print(f"\n✅ 已写出 {OUT_JSON}")
# ---------------- 写 CSV ----------------
rows = []
for code in sorted(out):
for cat, codes in out[code]["categories"].items():
for c in codes:
rows.append([code, country_cn.get(code, ""), cat, c,
sleeve_map.get(c, ("", ""))[0]])
with open(OUT_CSV, "w", encoding="utf-8-sig", newline="") as f:
w = csv.writer(f)
w.writerow(["country_code", "country", "category", "style_code", "sleeve_length"])
w.writerows(rows)
print(f"✅ 已写出 {OUT_CSV}{len(rows)} 行)")
# ---------------- 样例预览 ----------------
print("\n样例预览(每个国家取 1 个品类,最多 8 个款号):")
for code in list(sorted(out))[:6]:
cats_map = out[code]["categories"]
if not cats_map:
continue
cat0 = sorted(cats_map)[0]
codes = cats_map[cat0][:8]
print(f" [{code}] {country_cn.get(code,'')} / {cat0}: {', '.join(codes)}"
+ (" ..." if len(cats_map[cat0]) > 8 else ""))
if __name__ == "__main__":
main()
+18
View File
@@ -0,0 +1,18 @@
-- 以爬取清单(剔除后 115 个款号)为准,
-- 删除 spu.code 不在清单内的 SPU 及其对应 SKU。
-- 执行顺序:先删子表 sku,再删主表 spu。
-- 1) 删除非清单款号对应的 SKU
DELETE FROM sku
WHERE spu_id IN (
SELECT id FROM spu
WHERE UPPER(TRIM(code)) NOT IN ('5000B', 'AUTM001', 'AUTM002', 'AUTM003', 'BRTF004', 'BRTF007', 'BRTM001', 'BRTM002', 'C1717', 'CAHM002', 'CATM001', 'CATM006', 'CATM007', 'DEHM003', 'DETM001', 'DETM002', 'DF009', 'DF010', 'DG001', 'DG004', 'DG012', 'DG013', 'DG014', 'DG015', 'DG100', 'DG101', 'DG102', 'DG110', 'DG120', 'DG150', 'DG301', 'DG501', 'DG502', 'DG503', 'DG504', 'DG505', 'DG601', 'ESHM003', 'ESHM004', 'ESTK005', 'ESTM002', 'GBHK006', 'GBHK007', 'GBHM002', 'GBHM003', 'GBTF004', 'GBTK005', 'GBTK008', 'GBTK012', 'GBTM001', 'GBTM010', 'GBTM011', 'GBTM013', 'HM01', 'ITFM005', 'ITTK002', 'ITTM001', 'JPHM009', 'JPHM010', 'JPPX012', 'JPPX013', 'JPTK015', 'JPTM001', 'JPTM002', 'JPTM004', 'JPTM006', 'JPTM007', 'JPTM008', 'JSA004', 'JSA006', 'JSA008', 'JSA009', 'JSA011', 'JSB001', 'JSB002', 'JSB003', 'JSE008', 'JSS001', 'KRHM002', 'KRHM003', 'KRTM001', 'KRTM004', 'MESXT001', 'METB001', 'METN001', 'METP001', 'PET001', 'PLHF029', 'PLHM002', 'PLHM003', 'PLHM009', 'PLHM010', 'PLHM012', 'PLHM013', 'PLJM030', 'PLTF004', 'PLTF026', 'PLTF027', 'PLTF028', 'PLTK005', 'PLTK015', 'PLTK016', 'PLTM001', 'PLTM006', 'PLTM008', 'PLTM024', 'PLTM031', 'SAHM003', 'SATK004', 'SATU001', 'TBB001', 'VS001', 'VS002', 'VS003', 'VS004')
);
-- 2) 删除非清单款号的 SPU
DELETE FROM spu
WHERE UPPER(TRIM(code)) NOT IN ('5000B', 'AUTM001', 'AUTM002', 'AUTM003', 'BRTF004', 'BRTF007', 'BRTM001', 'BRTM002', 'C1717', 'CAHM002', 'CATM001', 'CATM006', 'CATM007', 'DEHM003', 'DETM001', 'DETM002', 'DF009', 'DF010', 'DG001', 'DG004', 'DG012', 'DG013', 'DG014', 'DG015', 'DG100', 'DG101', 'DG102', 'DG110', 'DG120', 'DG150', 'DG301', 'DG501', 'DG502', 'DG503', 'DG504', 'DG505', 'DG601', 'ESHM003', 'ESHM004', 'ESTK005', 'ESTM002', 'GBHK006', 'GBHK007', 'GBHM002', 'GBHM003', 'GBTF004', 'GBTK005', 'GBTK008', 'GBTK012', 'GBTM001', 'GBTM010', 'GBTM011', 'GBTM013', 'HM01', 'ITFM005', 'ITTK002', 'ITTM001', 'JPHM009', 'JPHM010', 'JPPX012', 'JPPX013', 'JPTK015', 'JPTM001', 'JPTM002', 'JPTM004', 'JPTM006', 'JPTM007', 'JPTM008', 'JSA004', 'JSA006', 'JSA008', 'JSA009', 'JSA011', 'JSB001', 'JSB002', 'JSB003', 'JSE008', 'JSS001', 'KRHM002', 'KRHM003', 'KRTM001', 'KRTM004', 'MESXT001', 'METB001', 'METN001', 'METP001', 'PET001', 'PLHF029', 'PLHM002', 'PLHM003', 'PLHM009', 'PLHM010', 'PLHM012', 'PLHM013', 'PLJM030', 'PLTF004', 'PLTF026', 'PLTF027', 'PLTF028', 'PLTK005', 'PLTK015', 'PLTK016', 'PLTM001', 'PLTM006', 'PLTM008', 'PLTM024', 'PLTM031', 'SAHM003', 'SATK004', 'SATU001', 'TBB001', 'VS001', 'VS002', 'VS003', 'VS004');
-- 校验:应返回 0
SELECT COUNT(*) AS orphan_sku FROM sku
WHERE spu_id NOT IN (SELECT id FROM spu);
+10
View File
@@ -0,0 +1,10 @@
-- 童装款号(22 个)对应 SKU 的 size_type 统一改为『欧美尺码年龄码』
UPDATE sku
SET size_type = '欧美尺码年龄码'
WHERE spu_id IN (SELECT id FROM spu WHERE UPPER(TRIM(code)) IN ('5000B', 'DG012', 'DG014', 'DG301', 'DG503', 'DG504', 'ESTK005', 'GBHK006', 'GBTK005', 'GBTK008', 'ITTK002', 'JPTK015', 'JSA004', 'METN001', 'PLHM009', 'PLHM010', 'PLHM012', 'PLHM013', 'PLTK005', 'PLTK015', 'PLTK016', 'SATK004'));
-- 校验
SELECT s.code, s.country, k.size_type, COUNT(*) AS n
FROM sku k JOIN spu s ON k.spu_id = s.id
WHERE UPPER(TRIM(s.code)) IN ('5000B', 'DG012', 'DG014', 'DG301', 'DG503', 'DG504', 'ESTK005', 'GBHK006', 'GBTK005', 'GBTK008', 'ITTK002', 'JPTK015', 'JSA004', 'METN001', 'PLHM009', 'PLHM010', 'PLHM012', 'PLHM013', 'PLTK005', 'PLTK015', 'PLTK016', 'SATK004')
GROUP BY s.code, s.country, k.size_type;
+15
View File
@@ -0,0 +1,15 @@
-- 以 style_codes_by_country.csv 中『童装T恤』品类的 19 个款号为准,
-- 更新对应 SPU 的 target_audience / season / kids_type / kids_age。
UPDATE spu
SET target_audience = '男童',
season = 'ALL/全球/所有',
kids_type = '上衣',
kids_age = '12岁及以下'
WHERE UPPER(TRIM(code)) IN ('5000B', 'DG012', 'DG014', 'DG301', 'DG503', 'ESTK005', 'GBTK005', 'GBTK008', 'GBTK012', 'ITTK002', 'JPTK015', 'JSA004', 'METN001', 'PLHM012', 'PLHM013', 'PLTK005', 'PLTK015', 'PLTK016', 'SATK004');
-- 校验(应返回被更新行数与取值分布)
SELECT target_audience, season, kids_type, kids_age, COUNT(*)
FROM spu
WHERE UPPER(TRIM(code)) IN ('5000B', 'DG012', 'DG014', 'DG301', 'DG503', 'ESTK005', 'GBTK005', 'GBTK008', 'GBTK012', 'ITTK002', 'JPTK015', 'JSA004', 'METN001', 'PLHM012', 'PLHM013', 'PLTK005', 'PLTK015', 'PLTK016', 'SATK004')
GROUP BY target_audience, season, kids_type, kids_age;
+16
View File
@@ -0,0 +1,16 @@
-- 以 style_codes_by_country.csv 中『男士卫衣』品类的 21 个款号为准,
-- 更新对应 SPU 的 details / collar_style / target_audience / season / sleeve_length_type。
UPDATE spu
SET details = '抽绳',
collar_style = '连帽',
target_audience = '男士',
season = '秋/冬',
sleeve_length_type = '长袖'
WHERE UPPER(TRIM(code)) IN ('CAHM002', 'DEHM003', 'DF009', 'DF010', 'ESHM003', 'ESHM004', 'GBHM002', 'GBHM003', 'HM01', 'JPHM009', 'JPHM010', 'JPPX012', 'JPPX013', 'JSB001', 'JSB002', 'JSB003', 'KRHM002', 'KRHM003', 'PLHM002', 'PLHM003', 'SAHM003');
-- 校验
SELECT details, collar_style, target_audience, season, sleeve_length_type, COUNT(*)
FROM spu
WHERE UPPER(TRIM(code)) IN ('CAHM002', 'DEHM003', 'DF009', 'DF010', 'ESHM003', 'ESHM004', 'GBHM002', 'GBHM003', 'HM01', 'JPHM009', 'JPHM010', 'JPPX012', 'JPPX013', 'JSB001', 'JSB002', 'JSB003', 'KRHM002', 'KRHM003', 'PLHM002', 'PLHM003', 'SAHM003')
GROUP BY details, collar_style, target_audience, season, sleeve_length_type;
+109
View File
@@ -0,0 +1,109 @@
-- 以 style_codes_by_country.csv 的 sleeve_length 为准,回填 SPU.sleeve_length_type
-- 逐个款号 UPDATE(防误伤)
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = '5000B';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'AUTM001';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'AUTM002';
UPDATE spu SET sleeve_length_type = '无袖' WHERE UPPER(TRIM(code)) = 'AUTM003';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'BRTF007';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'BRTM001';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'BRTM002';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'C1717';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'CAHM002';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'CATM001';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'CATM006';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'CATM007';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'DEHM003';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DETM001';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DETM002';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'DF009';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'DF010';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG001';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG004';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG012';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG013';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG014';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG015';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG100';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG101';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG102';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG110';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG120';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG150';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG301';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'DG501';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'DG502';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'DG503';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'DG504';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'DG601';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'ESHM003';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'ESHM004';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'ESTK005';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'ESTM002';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'GBHK006';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'GBHM002';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'GBHM003';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'GBTF004';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'GBTK005';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'GBTK008';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'GBTM001';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'GBTM013';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'HM01';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'ITFM005';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'ITTK002';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'ITTM001';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'JPHM009';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'JPHM010';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'JPTK015';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'JPTM001';
UPDATE spu SET sleeve_length_type = '无袖' WHERE UPPER(TRIM(code)) = 'JPTM002';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'JPTM004';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'JPTM006';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'JPTM007';
UPDATE spu SET sleeve_length_type = '无袖' WHERE UPPER(TRIM(code)) = 'JPTM008';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'JSA004';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'JSA006';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'JSA008';
UPDATE spu SET sleeve_length_type = '无袖' WHERE UPPER(TRIM(code)) = 'JSA009';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'JSA011';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'JSB001';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'JSB002';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'JSB003';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'JSE008';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'JSS001';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'KRHM002';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'KRHM003';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'KRTM001';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'KRTM004';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'MESXT001';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'METB001';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'METN001';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'METP001';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PET001';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'PLHF029';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'PLHM002';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'PLHM003';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'PLHM009';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'PLHM010';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PLHM012';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PLHM013';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'PLJM030';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PLTF004';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'PLTF026';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PLTF027';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PLTF028';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PLTK005';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PLTK015';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PLTK016';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PLTM001';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PLTM006';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PLTM008';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'PLTM024';
UPDATE spu SET sleeve_length_type = '长袖' WHERE UPPER(TRIM(code)) = 'SAHM003';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'SATK004';
UPDATE spu SET sleeve_length_type = '短袖' WHERE UPPER(TRIM(code)) = 'SATU001';
UPDATE spu SET sleeve_length_type = '无袖' WHERE UPPER(TRIM(code)) = 'TBB001';
UPDATE spu SET sleeve_length_type = '无袖' WHERE UPPER(TRIM(code)) = 'VS001';
UPDATE spu SET sleeve_length_type = '无袖' WHERE UPPER(TRIM(code)) = 'VS002';
UPDATE spu SET sleeve_length_type = '无袖' WHERE UPPER(TRIM(code)) = 'VS003';
UPDATE spu SET sleeve_length_type = '无袖' WHERE UPPER(TRIM(code)) = 'VS004';
BIN
View File
Binary file not shown.
+117
View File
@@ -0,0 +1,117 @@
country_code,country,category,style_code,sleeve_length
AU,澳大利亚,男士T恤,AUTM001,短袖
AU,澳大利亚,男士T恤,AUTM002,短袖
AU,澳大利亚,男士背心,AUTM003,无袖
BR,巴西,女士T恤,BRTF004,短袖
BR,巴西,女士T恤,BRTF007,短袖
BR,巴西,男士T恤,BRTM001,短袖
BR,巴西,男士T恤,BRTM002,短袖
CA,加拿大,男士T恤,CATM001,短袖
CA,加拿大,男士T恤,CATM006,短袖
CA,加拿大,男士T恤,CATM007,短袖
CA,加拿大,男士卫衣,CAHM002,长袖
DE,德国,男士T恤,DETM001,短袖
DE,德国,男士T恤,DETM002,短袖
DE,德国,男士卫衣,DEHM003,长袖
ES,西班牙,男士T恤,ESTM002,短袖
ES,西班牙,男士卫衣,ESHM003,长袖
ES,西班牙,男士卫衣,ESHM004,长袖
ES,西班牙,童装T恤,ESTK005,短袖
GB,英国,女士T恤,GBTF004,短袖
GB,英国,男士T恤,GBTM001,短袖
GB,英国,男士T恤,GBTM010,短袖
GB,英国,男士T恤,GBTM013,短袖
GB,英国,男士T恤 / GBTM011长袖T,GBTM011,长袖
GB,英国,男士卫衣,GBHM002,长袖
GB,英国,男士卫衣,GBHM003,长袖
GB,英国,童装T恤,GBTK005,短袖
GB,英国,童装T恤,GBTK008,短袖
GB,英国,童装T恤,GBTK012,长袖
GB,英国,童装卫衣,GBHK006,长袖
GB,英国,童装卫衣,GBHK007,长袖
IT,意大利,女士T恤,ITFM005,短袖
IT,意大利,男士T恤,ITTM001,短袖
IT,意大利,童装T恤,ITTK002,短袖
JP,日本,男士T恤,JPTM001,短袖
JP,日本,男士T恤,JPTM004,短袖
JP,日本,男士T恤,JPTM006,长袖
JP,日本,男士T恤,JPTM007,短袖
JP,日本,男士卫衣,JPHM009,长袖
JP,日本,男士卫衣,JPHM010,长袖
JP,日本,男士卫衣,JPPX012,长袖
JP,日本,男士卫衣,JPPX013,长袖
JP,日本,男士背心,JPTM002,无袖
JP,日本,男士背心,JPTM008,无袖
JP,日本,童装T恤,JPTK015,短袖
KR,韩国,男士T恤,KRTM001,短袖
KR,韩国,男士T恤,KRTM004,长袖
KR,韩国,男士卫衣,KRHM002,长袖
KR,韩国,男士卫衣,KRHM003,长袖
MX,墨西哥,女士T恤,METP001,短袖
MX,墨西哥,男士T恤,MESXT001,短袖
MX,墨西哥,男士T恤,METB001,短袖
MX,墨西哥,男士T恤,PET001,短袖
MX,墨西哥,男士卫衣,HM01,长袖
MX,墨西哥,男士背心,TBB001,无袖
MX,墨西哥,童装T恤,METN001,短袖
PL,波兰,女士T恤,PLTF004,短袖
PL,波兰,女士T恤,PLTF026,长袖
PL,波兰,女士T恤,PLTF027,短袖
PL,波兰,女士T恤,PLTF028,短袖
PL,波兰,女士卫衣,PLHF029,长袖
PL,波兰,男士T恤,PLTM001,短袖
PL,波兰,男士T恤,PLTM006,短袖
PL,波兰,男士T恤,PLTM008,短袖
PL,波兰,男士T恤,PLTM024,短袖
PL,波兰,男士T恤,PLTM031,短袖
PL,波兰,男士卫衣,PLHM002,长袖
PL,波兰,男士卫衣,PLHM003,长袖
PL,波兰,男士夹克,PLJM030,长袖
PL,波兰,童装T恤,PLHM012,短袖
PL,波兰,童装T恤,PLHM013,短袖
PL,波兰,童装T恤,PLTK005,短袖
PL,波兰,童装T恤,PLTK015,短袖
PL,波兰,童装T恤,PLTK016,短袖
PL,波兰,童装卫衣,PLHM009,长袖
PL,波兰,童装卫衣,PLHM010,长袖
SA,沙特阿拉伯,女士T恤,SATU001,短袖
SA,沙特阿拉伯,男士T恤,SATU001,短袖
SA,沙特阿拉伯,男士卫衣,SAHM003,长袖
SA,沙特阿拉伯,童装T恤,SATK004,短袖
US,美国,女士T恤,DG100,短袖
US,美国,女士T恤,DG101,短袖
US,美国,女士T恤,DG102,短袖
US,美国,女士T恤,DG110,短袖
US,美国,女士T恤,DG120,短袖
US,美国,女士T恤,DG150,短袖
US,美国,女士T恤,DG502,长袖
US,美国,女士T恤,DG601,短袖
US,美国,女士T恤,JSA008,短袖
US,美国,女士T恤,JSA011,短袖
US,美国,女士T恤,JSE008,短袖
US,美国,女士卫衣,DG501,长袖
US,美国,女士背心,JSA009,无袖
US,美国,女士背心,VS002,无袖
US,美国,女士背心,VS004,无袖
US,美国,男士T恤,C1717,短袖
US,美国,男士T恤,DG001,短袖
US,美国,男士T恤,DG004,短袖
US,美国,男士T恤,DG013,短袖
US,美国,男士T恤,DG015,短袖
US,美国,男士T恤,DG505,长袖
US,美国,男士T恤,JSA006,短袖
US,美国,男士T恤,JSS001,短袖
US,美国,男士卫衣,DF009,长袖
US,美国,男士卫衣,DF010,长袖
US,美国,男士卫衣,JSB001,长袖
US,美国,男士卫衣,JSB002,长袖
US,美国,男士卫衣,JSB003,长袖
US,美国,男士背心,VS001,无袖
US,美国,男士背心,VS003,无袖
US,美国,童装T恤,5000B,短袖
US,美国,童装T恤,DG012,短袖
US,美国,童装T恤,DG014,短袖
US,美国,童装T恤,DG301,短袖
US,美国,童装T恤,DG503,长袖
US,美国,童装T恤,JSA004,短袖
US,美国,童装卫衣,DG504,长袖
1 country_code country category style_code sleeve_length
2 AU 澳大利亚 男士T恤 AUTM001 短袖
3 AU 澳大利亚 男士T恤 AUTM002 短袖
4 AU 澳大利亚 男士背心 AUTM003 无袖
5 BR 巴西 女士T恤 BRTF004 短袖
6 BR 巴西 女士T恤 BRTF007 短袖
7 BR 巴西 男士T恤 BRTM001 短袖
8 BR 巴西 男士T恤 BRTM002 短袖
9 CA 加拿大 男士T恤 CATM001 短袖
10 CA 加拿大 男士T恤 CATM006 短袖
11 CA 加拿大 男士T恤 CATM007 短袖
12 CA 加拿大 男士卫衣 CAHM002 长袖
13 DE 德国 男士T恤 DETM001 短袖
14 DE 德国 男士T恤 DETM002 短袖
15 DE 德国 男士卫衣 DEHM003 长袖
16 ES 西班牙 男士T恤 ESTM002 短袖
17 ES 西班牙 男士卫衣 ESHM003 长袖
18 ES 西班牙 男士卫衣 ESHM004 长袖
19 ES 西班牙 童装T恤 ESTK005 短袖
20 GB 英国 女士T恤 GBTF004 短袖
21 GB 英国 男士T恤 GBTM001 短袖
22 GB 英国 男士T恤 GBTM010 短袖
23 GB 英国 男士T恤 GBTM013 短袖
24 GB 英国 男士T恤 / GBTM011长袖T GBTM011 长袖
25 GB 英国 男士卫衣 GBHM002 长袖
26 GB 英国 男士卫衣 GBHM003 长袖
27 GB 英国 童装T恤 GBTK005 短袖
28 GB 英国 童装T恤 GBTK008 短袖
29 GB 英国 童装T恤 GBTK012 长袖
30 GB 英国 童装卫衣 GBHK006 长袖
31 GB 英国 童装卫衣 GBHK007 长袖
32 IT 意大利 女士T恤 ITFM005 短袖
33 IT 意大利 男士T恤 ITTM001 短袖
34 IT 意大利 童装T恤 ITTK002 短袖
35 JP 日本 男士T恤 JPTM001 短袖
36 JP 日本 男士T恤 JPTM004 短袖
37 JP 日本 男士T恤 JPTM006 长袖
38 JP 日本 男士T恤 JPTM007 短袖
39 JP 日本 男士卫衣 JPHM009 长袖
40 JP 日本 男士卫衣 JPHM010 长袖
41 JP 日本 男士卫衣 JPPX012 长袖
42 JP 日本 男士卫衣 JPPX013 长袖
43 JP 日本 男士背心 JPTM002 无袖
44 JP 日本 男士背心 JPTM008 无袖
45 JP 日本 童装T恤 JPTK015 短袖
46 KR 韩国 男士T恤 KRTM001 短袖
47 KR 韩国 男士T恤 KRTM004 长袖
48 KR 韩国 男士卫衣 KRHM002 长袖
49 KR 韩国 男士卫衣 KRHM003 长袖
50 MX 墨西哥 女士T恤 METP001 短袖
51 MX 墨西哥 男士T恤 MESXT001 短袖
52 MX 墨西哥 男士T恤 METB001 短袖
53 MX 墨西哥 男士T恤 PET001 短袖
54 MX 墨西哥 男士卫衣 HM01 长袖
55 MX 墨西哥 男士背心 TBB001 无袖
56 MX 墨西哥 童装T恤 METN001 短袖
57 PL 波兰 女士T恤 PLTF004 短袖
58 PL 波兰 女士T恤 PLTF026 长袖
59 PL 波兰 女士T恤 PLTF027 短袖
60 PL 波兰 女士T恤 PLTF028 短袖
61 PL 波兰 女士卫衣 PLHF029 长袖
62 PL 波兰 男士T恤 PLTM001 短袖
63 PL 波兰 男士T恤 PLTM006 短袖
64 PL 波兰 男士T恤 PLTM008 短袖
65 PL 波兰 男士T恤 PLTM024 短袖
66 PL 波兰 男士T恤 PLTM031 短袖
67 PL 波兰 男士卫衣 PLHM002 长袖
68 PL 波兰 男士卫衣 PLHM003 长袖
69 PL 波兰 男士夹克 PLJM030 长袖
70 PL 波兰 童装T恤 PLHM012 短袖
71 PL 波兰 童装T恤 PLHM013 短袖
72 PL 波兰 童装T恤 PLTK005 短袖
73 PL 波兰 童装T恤 PLTK015 短袖
74 PL 波兰 童装T恤 PLTK016 短袖
75 PL 波兰 童装卫衣 PLHM009 长袖
76 PL 波兰 童装卫衣 PLHM010 长袖
77 SA 沙特阿拉伯 女士T恤 SATU001 短袖
78 SA 沙特阿拉伯 男士T恤 SATU001 短袖
79 SA 沙特阿拉伯 男士卫衣 SAHM003 长袖
80 SA 沙特阿拉伯 童装T恤 SATK004 短袖
81 US 美国 女士T恤 DG100 短袖
82 US 美国 女士T恤 DG101 短袖
83 US 美国 女士T恤 DG102 短袖
84 US 美国 女士T恤 DG110 短袖
85 US 美国 女士T恤 DG120 短袖
86 US 美国 女士T恤 DG150 短袖
87 US 美国 女士T恤 DG502 长袖
88 US 美国 女士T恤 DG601 短袖
89 US 美国 女士T恤 JSA008 短袖
90 US 美国 女士T恤 JSA011 短袖
91 US 美国 女士T恤 JSE008 短袖
92 US 美国 女士卫衣 DG501 长袖
93 US 美国 女士背心 JSA009 无袖
94 US 美国 女士背心 VS002 无袖
95 US 美国 女士背心 VS004 无袖
96 US 美国 男士T恤 C1717 短袖
97 US 美国 男士T恤 DG001 短袖
98 US 美国 男士T恤 DG004 短袖
99 US 美国 男士T恤 DG013 短袖
100 US 美国 男士T恤 DG015 短袖
101 US 美国 男士T恤 DG505 长袖
102 US 美国 男士T恤 JSA006 短袖
103 US 美国 男士T恤 JSS001 短袖
104 US 美国 男士卫衣 DF009 长袖
105 US 美国 男士卫衣 DF010 长袖
106 US 美国 男士卫衣 JSB001 长袖
107 US 美国 男士卫衣 JSB002 长袖
108 US 美国 男士卫衣 JSB003 长袖
109 US 美国 男士背心 VS001 无袖
110 US 美国 男士背心 VS003 无袖
111 US 美国 童装T恤 5000B 短袖
112 US 美国 童装T恤 DG012 短袖
113 US 美国 童装T恤 DG014 短袖
114 US 美国 童装T恤 DG301 短袖
115 US 美国 童装T恤 DG503 长袖
116 US 美国 童装T恤 JSA004 短袖
117 US 美国 童装卫衣 DG504 长袖
+565
View File
@@ -0,0 +1,565 @@
{
"US": {
"country": "美国",
"categories": {
"女士T恤": [
"DG100",
"DG101",
"DG102",
"DG110",
"DG120",
"DG150",
"DG502",
"DG601",
"JSA008",
"JSA011",
"JSE008"
],
"女士卫衣": [
"DG501"
],
"女士背心": [
"JSA009",
"VS002",
"VS004"
],
"男士T恤": [
"C1717",
"DG001",
"DG004",
"DG013",
"DG015",
"DG505",
"JSA006",
"JSS001"
],
"男士卫衣": [
"DF009",
"DF010",
"JSB001",
"JSB002",
"JSB003"
],
"男士背心": [
"VS001",
"VS003"
],
"童装T恤": [
"5000B",
"DG012",
"DG014",
"DG301",
"DG503",
"JSA004"
],
"童装卫衣": [
"DG504"
]
},
"sleeve_length": {
"5000B": "短袖",
"C1717": "短袖",
"DF009": "长袖",
"DF010": "长袖",
"DG001": "短袖",
"DG004": "短袖",
"DG012": "短袖",
"DG013": "短袖",
"DG014": "短袖",
"DG015": "短袖",
"DG100": "短袖",
"DG101": "短袖",
"DG102": "短袖",
"DG110": "短袖",
"DG120": "短袖",
"DG150": "短袖",
"DG301": "短袖",
"DG501": "长袖",
"DG502": "长袖",
"DG503": "长袖",
"DG504": "长袖",
"DG505": "长袖",
"DG601": "短袖",
"JSA004": "短袖",
"JSA006": "短袖",
"JSA008": "短袖",
"JSA009": "无袖",
"JSA011": "短袖",
"JSB001": "长袖",
"JSB002": "长袖",
"JSB003": "长袖",
"JSE008": "短袖",
"JSS001": "短袖",
"VS001": "无袖",
"VS002": "无袖",
"VS003": "无袖",
"VS004": "无袖"
},
"sleeve_source": {
"5000B": "默认(T恤)",
"C1717": "默认(T恤)",
"DF009": "品类推断",
"DF010": "品类推断",
"DG001": "默认(T恤)",
"DG004": "默认(T恤)",
"DG012": "默认(T恤)",
"DG013": "默认(T恤)",
"DG014": "默认(T恤)",
"DG015": "默认(T恤)",
"DG100": "默认(T恤)",
"DG101": "默认(T恤)",
"DG102": "默认(T恤)",
"DG110": "默认(T恤)",
"DG120": "默认(T恤)",
"DG150": "默认(T恤)",
"DG301": "默认(T恤)",
"DG501": "品类推断",
"DG502": "name",
"DG503": "name",
"DG504": "品类推断",
"DG505": "name",
"DG601": "默认(T恤)",
"JSA004": "默认(T恤)",
"JSA006": "默认(T恤)",
"JSA008": "默认(T恤)",
"JSA009": "name",
"JSA011": "默认(T恤)",
"JSB001": "品类推断",
"JSB002": "品类推断",
"JSB003": "品类推断",
"JSE008": "默认(T恤)",
"JSS001": "默认(T恤)",
"VS001": "name",
"VS002": "name",
"VS003": "name",
"VS004": "name"
}
},
"BR": {
"country": "巴西",
"categories": {
"女士T恤": [
"BRTF004",
"BRTF007"
],
"男士T恤": [
"BRTM001",
"BRTM002"
]
},
"sleeve_length": {
"BRTF004": "短袖",
"BRTF007": "短袖",
"BRTM001": "短袖",
"BRTM002": "短袖"
},
"sleeve_source": {
"BRTF004": "默认(T恤)",
"BRTF007": "默认(T恤)",
"BRTM001": "默认(T恤)",
"BRTM002": "默认(T恤)"
}
},
"AU": {
"country": "澳大利亚",
"categories": {
"男士T恤": [
"AUTM001",
"AUTM002"
],
"男士背心": [
"AUTM003"
]
},
"sleeve_length": {
"AUTM001": "短袖",
"AUTM002": "短袖",
"AUTM003": "无袖"
},
"sleeve_source": {
"AUTM001": "默认(T恤)",
"AUTM002": "默认(T恤)",
"AUTM003": "name"
}
},
"PL": {
"country": "波兰",
"categories": {
"女士T恤": [
"PLTF004",
"PLTF026",
"PLTF027",
"PLTF028"
],
"女士卫衣": [
"PLHF029"
],
"男士T恤": [
"PLTM001",
"PLTM006",
"PLTM008",
"PLTM024",
"PLTM031"
],
"男士卫衣": [
"PLHM002",
"PLHM003"
],
"男士夹克": [
"PLJM030"
],
"童装T恤": [
"PLHM012",
"PLHM013",
"PLTK005",
"PLTK015",
"PLTK016"
],
"童装卫衣": [
"PLHM009",
"PLHM010"
]
},
"sleeve_length": {
"PLHF029": "长袖",
"PLHM002": "长袖",
"PLHM003": "长袖",
"PLHM009": "长袖",
"PLHM010": "长袖",
"PLHM012": "短袖",
"PLHM013": "短袖",
"PLJM030": "长袖",
"PLTF004": "短袖",
"PLTF026": "长袖",
"PLTF027": "短袖",
"PLTF028": "短袖",
"PLTK005": "短袖",
"PLTK015": "短袖",
"PLTK016": "短袖",
"PLTM001": "短袖",
"PLTM006": "短袖",
"PLTM008": "短袖",
"PLTM024": "短袖",
"PLTM031": "短袖"
},
"sleeve_source": {
"PLHF029": "name",
"PLHM002": "品类推断",
"PLHM003": "品类推断",
"PLHM009": "品类推断",
"PLHM010": "品类推断",
"PLHM012": "默认(T恤)",
"PLHM013": "name",
"PLJM030": "品类推断",
"PLTF004": "默认(T恤)",
"PLTF026": "name",
"PLTF027": "默认(T恤)",
"PLTF028": "默认(T恤)",
"PLTK005": "默认(T恤)",
"PLTK015": "默认(T恤)",
"PLTK016": "name",
"PLTM001": "默认(T恤)",
"PLTM006": "默认(T恤)",
"PLTM008": "name",
"PLTM024": "默认(T恤)",
"PLTM031": "默认(T恤)"
}
},
"KR": {
"country": "韩国",
"categories": {
"男士T恤": [
"KRTM001",
"KRTM004"
],
"男士卫衣": [
"KRHM002",
"KRHM003"
]
},
"sleeve_length": {
"KRHM002": "长袖",
"KRHM003": "长袖",
"KRTM001": "短袖",
"KRTM004": "长袖"
},
"sleeve_source": {
"KRHM002": "品类推断",
"KRHM003": "品类推断",
"KRTM001": "默认(T恤)",
"KRTM004": "name"
}
},
"SA": {
"country": "沙特阿拉伯",
"categories": {
"女士T恤": [
"SATU001"
],
"男士T恤": [
"SATU001"
],
"男士卫衣": [
"SAHM003"
],
"童装T恤": [
"SATK004"
]
},
"sleeve_length": {
"SAHM003": "长袖",
"SATK004": "短袖",
"SATU001": "短袖"
},
"sleeve_source": {
"SAHM003": "品类推断",
"SATK004": "默认(T恤)",
"SATU001": "默认(T恤)"
}
},
"MX": {
"country": "墨西哥",
"categories": {
"女士T恤": [
"METP001"
],
"男士T恤": [
"MESXT001",
"METB001",
"PET001"
],
"男士卫衣": [
"HM01"
],
"男士背心": [
"TBB001"
],
"童装T恤": [
"METN001"
]
},
"sleeve_length": {
"HM01": "长袖",
"MESXT001": "短袖",
"METB001": "短袖",
"METN001": "短袖",
"METP001": "短袖",
"PET001": "短袖",
"TBB001": "无袖"
},
"sleeve_source": {
"HM01": "品类推断",
"MESXT001": "默认(T恤)",
"METB001": "默认(T恤)",
"METN001": "默认(T恤)",
"METP001": "默认(T恤)",
"PET001": "默认(T恤)",
"TBB001": "name"
}
},
"IT": {
"country": "意大利",
"categories": {
"女士T恤": [
"ITFM005"
],
"男士T恤": [
"ITTM001"
],
"童装T恤": [
"ITTK002"
]
},
"sleeve_length": {
"ITFM005": "短袖",
"ITTK002": "短袖",
"ITTM001": "短袖"
},
"sleeve_source": {
"ITFM005": "name",
"ITTK002": "name",
"ITTM001": "默认(T恤)"
}
},
"GB": {
"country": "英国",
"categories": {
"女士T恤": [
"GBTF004"
],
"男士T恤": [
"GBTM001",
"GBTM010",
"GBTM013"
],
"男士T恤 / GBTM011长袖T": [
"GBTM011"
],
"男士卫衣": [
"GBHM002",
"GBHM003"
],
"童装T恤": [
"GBTK005",
"GBTK008",
"GBTK012"
],
"童装卫衣": [
"GBHK006",
"GBHK007"
]
},
"sleeve_length": {
"GBHK006": "长袖",
"GBHK007": "长袖",
"GBHM002": "长袖",
"GBHM003": "长袖",
"GBTF004": "短袖",
"GBTK005": "短袖",
"GBTK008": "短袖",
"GBTK012": "长袖",
"GBTM001": "短袖",
"GBTM010": "短袖",
"GBTM011": "长袖",
"GBTM013": "短袖"
},
"sleeve_source": {
"GBHK006": "品类推断",
"GBHK007": "品类推断",
"GBHM002": "品类推断",
"GBHM003": "品类推断",
"GBTF004": "默认(T恤)",
"GBTK005": "默认(T恤)",
"GBTK008": "name",
"GBTK012": "name",
"GBTM001": "默认(T恤)",
"GBTM010": "默认(T恤)",
"GBTM011": "name",
"GBTM013": "默认(T恤)"
}
},
"ES": {
"country": "西班牙",
"categories": {
"男士T恤": [
"ESTM002"
],
"男士卫衣": [
"ESHM003",
"ESHM004"
],
"童装T恤": [
"ESTK005"
]
},
"sleeve_length": {
"ESHM003": "长袖",
"ESHM004": "长袖",
"ESTK005": "短袖",
"ESTM002": "短袖"
},
"sleeve_source": {
"ESHM003": "品类推断",
"ESHM004": "品类推断",
"ESTK005": "默认(T恤)",
"ESTM002": "默认(T恤)"
}
},
"CA": {
"country": "加拿大",
"categories": {
"男士T恤": [
"CATM001",
"CATM006",
"CATM007"
],
"男士卫衣": [
"CAHM002"
]
},
"sleeve_length": {
"CAHM002": "长袖",
"CATM001": "短袖",
"CATM006": "短袖",
"CATM007": "短袖"
},
"sleeve_source": {
"CAHM002": "品类推断",
"CATM001": "默认(T恤)",
"CATM006": "默认(T恤)",
"CATM007": "默认(T恤)"
}
},
"JP": {
"country": "日本",
"categories": {
"男士T恤": [
"JPTM001",
"JPTM004",
"JPTM006",
"JPTM007"
],
"男士卫衣": [
"JPHM009",
"JPHM010",
"JPPX012",
"JPPX013"
],
"男士背心": [
"JPTM002",
"JPTM008"
],
"童装T恤": [
"JPTK015"
]
},
"sleeve_length": {
"JPHM009": "长袖",
"JPHM010": "长袖",
"JPPX012": "长袖",
"JPPX013": "长袖",
"JPTK015": "短袖",
"JPTM001": "短袖",
"JPTM002": "无袖",
"JPTM004": "短袖",
"JPTM006": "长袖",
"JPTM007": "短袖",
"JPTM008": "无袖"
},
"sleeve_source": {
"JPHM009": "品类推断",
"JPHM010": "品类推断",
"JPPX012": "品类推断",
"JPPX013": "品类推断",
"JPTK015": "默认(T恤)",
"JPTM001": "默认(T恤)",
"JPTM002": "name",
"JPTM004": "默认(T恤)",
"JPTM006": "name",
"JPTM007": "默认(T恤)",
"JPTM008": "name"
}
},
"DE": {
"country": "德国",
"categories": {
"男士T恤": [
"DETM001",
"DETM002"
],
"男士卫衣": [
"DEHM003"
]
},
"sleeve_length": {
"DEHM003": "长袖",
"DETM001": "短袖",
"DETM002": "短袖"
},
"sleeve_source": {
"DEHM003": "品类推断",
"DETM001": "默认(T恤)",
"DETM002": "默认(T恤)"
}
}
}
+10
View File
@@ -0,0 +1,10 @@
-- 清单『品类含 T恤 且 长袖』的 5 个款号:
-- sleeve_length_type='长袖'season='秋/冬'
UPDATE spu
SET sleeve_length_type = '长袖',
season = '秋/冬'
WHERE UPPER(TRIM(code)) IN ('DG502', 'DG503', 'JPTM006', 'KRTM004', 'PLTF026');
-- 校验
SELECT code, sleeve_length_type, season FROM spu
WHERE UPPER(TRIM(code)) IN ('DG502', 'DG503', 'JPTM006', 'KRTM004', 'PLTF026');
+7
View File
@@ -0,0 +1,7 @@
-- 背心款号(9 个)sleeve_length_type 统一为『无袖』
UPDATE spu SET sleeve_length_type = '无袖'
WHERE UPPER(TRIM(code)) IN ('AUTM003', 'JPTM002', 'JPTM008', 'JSA009', 'TBB001', 'VS001', 'VS002', 'VS003', 'VS004');
-- 校验
SELECT code, country, sleeve_length_type FROM spu
WHERE UPPER(TRIM(code)) IN ('AUTM003', 'JPTM002', 'JPTM008', 'JSA009', 'TBB001', 'VS001', 'VS002', 'VS003', 'VS004');